Bash循环不起作用 - 找不到命令“[0%”

时间:2015-07-24 03:18:58

标签: linux bash loops

我今天早上刚刚在Bash写了一个ping扫描脚本,猜猜是什么:它不起作用。你可以检查一下我错过了什么。

这是脚本:

for i in `seq 1 255`
do
    if ["$(ping -c1 -W1 -n 192.168.1.$i | grep '%' | cut -d',' -f3 | cut -d' ' -f2)" -eq "0%"]
    then echo "Host live"
    else echo "Host down"
    fi
done

这是错误:

bash: [0%: command not found
Host down
bash: [100%: command not found
Host down

我的目的是制作ping扫描程序,扫描范围192.168.1.1-255并通知主机的状态。我知道nmap,但只想学习Bash的技能,所以我做了这个。请尝试告诉错误的含义。我的意思是什么命令它指的是“命令未找到”?

2 个答案:

答案 0 :(得分:5)

如果有任何问题,ping命令会返回错误代码,因此您无需解析输出:

for i in {1..255}
do
  if ping -c1 -W1 -n "192.168.1.$i"
  then
    echo 'Host live'
  else
    echo 'Host down'
  fi
done

答案 1 :(得分:4)

初步诊断

[命令在其名称后面需要一个空格,就像rm命令在其名称和ls命令之后需要一个空格一样,并且...... [命令还要求其最后一个参数为],因此拼写,因此在此之前也需要有一个空格。

你有:

if ["$(ping -c1 -W1 -n 192.168.1.$i | grep '%' | cut -d',' -f3 | cut -d' ' -f2)" -eq "0%"]

至少,你需要:

if [ "$(ping -c1 -W1 -n 192.168.1.$i | grep '%' | cut -d',' -f3 | cut -d' ' -f2)" -eq "0%" ]

次要问题

请注意,“至少”意味着,除其他外,我没有花时间分析为什么在测试条件下执行复杂的4个命令序列,或者寻找将其减少到2个的方法(使用grepcut两次表明sed或更强大的工具会更好。我抱怨问题的原始版本中的格式,其中循环(它不是嵌套循环,顺便说一句 - 或者它不在显示的代码中)都在一条线上,这要归功于Bash在历史中展平它。例如,我的代码版本中的分号就少得多。 -eq中的[运算符用于测试数字的相等性(反向约定适用于Perl,其中eq用于测试字符串和==测试数字)。请注意,POSIX标准[(又名test)不支持==作为=的同义词,尽管Bash会这样做。作为数字比较的参数,"0%"可以作为参数并不完全清楚。许多程序都不会反对 - 零可以转换,残留无关紧要;其他人可能会合法地决定抱怨整个字符串无法转换,所以这是错误的。谨慎的代码不会有断开连接的风险。

请参阅Steven Pennyanswer以更彻底地重写代码。我的答案仍然是对无法找到名为[0%[100%的命令的直接问题的有效诊断。