2016-09-27 82 views
-1

此脚本尝试ping通主机字符串数组。bash脚本在for循环中出现意外其他

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脚本这样如果有一个人能告诉我,为什么我得到附近意外的标记'其他”

语法错误并且如果这是一个不错的办法。在此先感谢

+3

请将您的代码粘贴到http://www.shellcheck.net/您在'if'[$?'中有一个拼写错误,它应该在' if'。 – fedorqui

回答

4

[不是bash的语法的一部分;它是一个常规字符,如a8。因此,解析器不会将if[识别为两个词if[;它只是看到名称为if[,它假定它可能是一个命令名称,然后是在该行尾部结束的一系列参数。以下行也是一个有效的命令。 下一个行,但是,从else开始,这是一个可识别的关键字,因此不能出现在命令位置,但仅作为正在进行的if语句的一部分,触发该错误。

所有这一切都是说,你需要必须单独if[一个空格。

if [ $? -eq 0 ]; then 

(你还需要then之前一个分号,如果它出现在同一行上,这将是你固定空间的问题后遇到的下一个问题。)

4

行号6,本应与分号;,并需要在ifif[ $?行后的空格。

if [ $? -eq 0 ]; then 

比较推荐的方法是,你可以直接在为什么我用了-c标志使用ping's出口代码if语句作为

if ping -c 1 "$i" &> /dev/null 
then 
    echo "$i is online" 
else 
    echo "$i is not online" 
fi 

见下文摘自man ping页面。使用http://www.shellcheck.net/来调试这种微不足道的语法错误。

+0

您还修复了if和[ – Lennart

+0

'之间缺乏空格';'是分号,这是一个问题,但不是直接的问题。 – chepner

+0

@Lennart:感谢您的评论,请立即参考我的更新! – Inian

2

if [ $? -eq 0 ]; then你需要有一个在if[之间的空格,也错过了;