如果在Linux终端中的循环中语句不起作用



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

相关内容

  • 没有找到相关文章

最新更新