2016-09-27 3 views
-1

этот скрипт пытается выполнить ping через массив строк хоста.bash script неожиданный else in 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 

Я новичок в Баш сценарии, так что если кто-нибудь может сказать мне, почему я получаю синтаксическую ошибку

рядом с неожиданной лексемой `еще»

, а также, если это хороший подход. Заранее спасибо

+3

Пожалуйста, вставьте код в http://www.shellcheck.net/ у вас есть опечатка в 'если [$?', который должен иметь место после ' if'. – fedorqui

ответ

4

[ не является частью синтаксиса bash; это обычный персонаж, такой как a или 8. Таким образом, синтаксический анализатор не распознает if[ как два слова if и [; он просто видит имя if[, которое, по его мнению, может быть именем команды, за которым следует серия аргументов, заканчивающихся концом строки. Следующая строка также является допустимой командой. Однако строка next начинается с else, которая является признанным ключевым словом и, следовательно, не может встречаться в командном положении, но только как часть текущего if оператора, вызывая ошибку.

Все, что можно сказать, вы должно отдельно if и [ с пространством.

if [ $? -eq 0 ]; then 

(Кроме того, необходимо с запятой перед then, если он появляется на той же линии, которая будет следующей проблемой вы столкнулись после устранения проблемы пространства.)

4

Номер строки 6, должен был быть с точкой с запятой ; и понадобилось место после 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 флаг.

-c count 
     Stop after sending count ECHO_REQUEST packets. With deadline option, ping waits for count ECHO_REPLY packets, until the timeout expires. 

Использование http://www.shellcheck.net/, отлаживать такие тривиальные ошибки синтаксиса.

+0

Вы также исправили недостаток места между if и [ – Lennart

+0

';' является точкой с запятой, и это проблема, но не проблема. – chepner

+0

@ Lennart: Спасибо за комментарий, отправьте мое обновление прямо сейчас! – Inian

2

if [ $? -eq 0 ]; then Вы должны иметь пространство между if и [, а также вы пропустили ;