for循环中的bash脚本意外

时间:2016-09-27 13:19:12

标签: bash

此脚本尝试ping主机字符串数组。

for i in "${arr[@]}"
do
   echo "check if $i is online"
   ping -c1 $i &>/dev/null
   if[ $? -eq 0 ] then
        echo "$i is online"
   else
        echo "$i is not online"
   fi
done

我是bash脚本的新手,所以如果有人可以告诉我为什么会得到一个

意外标记'else'附近的语法错误

如果这是一个好方法。提前致谢

3 个答案:

答案 0 :(得分:4)

第6行应使用分号;,并且需要在行if的{​​{1}}之后留出空格。

if[ $?

更推荐的方法是你可以直接在if语句中使用 if [ $? -eq 0 ]; then 退出代码作为

ping's

请参阅if ping -c 1 "$i" &> /dev/null then echo "$i is online" else echo "$i is not online" fi 页面上的以下摘录,了解我使用man ping标志的原因。

-c

使用http://www.shellcheck.net/来调试此类琐碎的语法错误。

答案 1 :(得分:4)

[不属于bash语法的一部分;它是常规字符,如a8。因此,解析器无法将if[识别为两个单词if[;它只是看到名称if[,它假定它可能是一个命令名,后跟一行终止于行尾的参数。以下行也是有效命令。但是, next 行以else开头,if是一个可识别的关键字,因此不能出现在命令位置,而只能作为正在进行的if语句的一部分,触发错误。

所有这些都是说,必须[if [ $? -eq 0 ]; then 与空格分开。

then

(如果Select出现在同一行,你还需要一个分号,这是修复空间问题后遇到的下一个问题。)

答案 2 :(得分:2)

if [ $? -eq 0 ]; then您需要在if[之间留出空格,而且您错过了;