在linux终端循环中的IF语句不起作用

时间:2015-05-14 14:13:30

标签: linux bash if-statement for-loop

目前我正在尝试在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

我已经检查了括号之间的空格,我也尝试删除它们,但这些解决方案都没有奏效。你能告诉我我的命令有什么问题吗?我错过了什么?

提前非常感谢你。

3 个答案:

答案 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