当前我正在尝试在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
我已经检查了支架之间的空间,我也尝试将它们删除,但是这些解决方案均未起作用。你能告诉我我的命令有什么问题吗?我想念什么?
非常感谢您。
您缺少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
目前,您的"单行"脚本完全不可读,因此包含错误也就不足为奇了。将其更改为:
#!/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
,如果模式匹配,则返回成功。
,因为似乎没有人对此发表评论。
您将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
被外壳视为单个命令,而不是两个命令。
特别是被视为(清理以使其更明显):
count=$(command) if arg1 arg2 arg3 > outfile
然后将if
制作为命令名称(和count
在该if
命令的环境中设置一个变量),而不是您预期的是,类似于其工作原理的shell关键字:
$ printenv | grep FOO
$ FOO=bar printenv | grep FOO
FOO=bar