2016-11-14 4 views
1

Следующий сценарий bash печатает "ERROR!" а не «Сервер реакции на ошибку», даже если Wget возвращает 8:Статус выхода, установленный оператором сравнения в сценарии bash

#!/bin/bash 

wget -q "www.google.com/unknown.html" 
if [ $? -eq 0 ] 
then 
    echo "Fetch successful!" 
elif [ $? -eq 8 ] 
then 
    echo "Server error response" 
else 
    echo "ERROR!" 
fi 

Когда сценарий выше запускается с -x, первое сравнение с 0, кажется, установив статус выхода 1:

+ wget www.google.com/unknown.html 
+ '[' 8 -eq 0 ']' 
+ '[' 1 -eq 8 ']' 
+ echo 'ERROR!' 
ERROR! 

Я исправил это, используя переменную для сохранения статуса выхода wget, но я не могу найти ссылку на различные способы, в которых $? установлен. Детали выпечки:

$ bash --version 
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu) 
Copyright (C) 2013 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later 
<http://gnu.org/licenses/gpl.html> 

This is free software; you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 

Может ли кто-нибудь указать мне на это?

+0

'man wget | меньше +/EXIT'? – Cyrus

ответ

3

$? объясняется, хотя и очень кратко, в специальных параметров параметры секции man bash:

?  Expands to the exit status of the most recently executed fore- 
      ground pipeline. 

@chepner положить его лучшим в своем комментарии:

Ключ дело в том, что каждый [ ... ] является отдельным передним конвейером, не являются частью синтаксиса оператора if, и они выполняются в порядке, обновляя $? по мере продвижения.

Если вы хотите использовать если-нибудь цепь, а затем сохранить значение $? в переменной и использовать условия на этой переменной:

wget -q "www.google.com/unknown.html" 
x=$? 
if [ $x -eq 0 ] 
then 
    echo "Fetch successful!" 
elif [ $x -eq 8 ] 
then 
    echo "Server error response" 
else 
    echo "ERROR!" 
fi 

Но в этом примере, case будет более практично:

wget -q "www.google.com/unknown.html" 
case $? in 
    0) 
     echo "Fetch successful!" ;; 
    8) 
     echo "Server error response" ;; 
    *) 
     echo "ERROR!" 
esac 
+1

Главное, чтобы понять, что каждый '[...]' является отдельным конвейером переднего плана, а не частью синтаксиса оператора 'if', и они выполняются по порядку, обновляя' $? 'По мере продвижения. – chepner

+0

Красиво положил, спасибо @chepner! – janos

+0

@чепнер, спасибо! Есть ли ссылка для условия if, являющегося «конвейером»? Откуда вы узнали об этом? – swoop81

0

Попробуйте использовать переключатель на $? или сохранить $? в переменной.

+0

Спасибо, я знаю, как решить проблему (см. Мой оригинальный вопрос). Мне просто нужна справочная страница или ссылка, в которой говорится о том, что условные обозначения являются предварительными конвейерами, так как @chepner говорит выше. – swoop81

Смежные вопросы