目前我正在尝试在crontab中执行bash文件。但是,命令本身不起作用,这是命令。
for ip in $(seq 3 80); do for ip2 in $(seq 9 254); do count=$(ping -c 1 192.168.$ip.$ip2 | grep icmp* | wc -l) if [ $count -eq 0 ]; then echo "Host unreachable" else php /var/www/phpfile.php 192.168.$ip.$ip2 > 192.168.$ip.$ip2.txt; done; done
执行此命令时控制台显示的错误是:
if: Command not found
我已经检查了括号之间的空格,我也尝试删除它们,但这些解决方案都没有奏效。你能告诉我我的命令有什么问题吗?我错过了什么?
提前非常感谢你。
答案 0 :(得分:1)
您错过了fi
和一些;
,请尝试此操作:
for ip in $(seq 3 80); do for ip2 in $(seq 9 254); do count=$(ping -c 1 192.168.$ip.$ip2 | grep icmp* | wc -l); if [ $count -eq 0 ]; then echo "Host unreachable"; else php /var/www/phpfile.php 192.168.$ip.$ip2 > 192.168.$ip.$ip2.txt;fi; done; done
最好(为了便于阅读)将代码分成多行,并将它们全部放在一行中:
for ip in $(seq 3 80); do
for ip2 in $(seq 9 254); do
count=$(ping -c 1 192.168.$ip.$ip2 | grep icmp* | wc -l)
if [ $count -eq 0 ]; then
echo "Host unreachable"
else php /var/www/phpfile.php 192.168.$ip.$ip2 > 192.168.$ip.$ip2.txt;
fi
done
done
答案 1 :(得分:1)
目前,您的"单行"脚本是完全不可读的,所以它包含错误并不奇怪。将其更改为:
#!/bin/sh
for ip in $(seq 3 80); do
for ip2 in $(seq 9 254); do
dest="192.168.$ip.$ip2"
if ping -c 1 "$dest" | grep -q 'icmp*'; then
php /var/www/phpfile.php "$dest" > "$dest".txt
else
echo "Host unreachable"
fi
done
done
并从您的crontab中调用它。
我已删除grep | wc -l
的无用用法,而不是使用grep -q
,如果模式匹配则返回成功。
答案 2 :(得分:0)
因为似乎没有其他人对此发表评论。
你将if: Command not found
作为错误的原因是内循环的主体:
count=$(ping -c 1 192.168.$ip.$ip2 | grep icmp* | wc -l) if [ $count -eq 0 ]; then echo "Host unreachable" else php /var/www/phpfile.php 192.168.$ip.$ip2 > 192.168.$ip.$ip2.txt
shell将视为单个命令,而不是两个命令。
特别是它被视为(清理使其更明显):
count=$(command) if arg1 arg2 arg3 > outfile
然后使if
命令名称(和count
在该if
命令的环境中设置变量)而不是如您所料,shell关键字类似于此工作原理:
$ printenv | grep FOO
$ FOO=bar printenv | grep FOO
FOO=bar