Что если [$? -eq 0 ] означает для сценариев оболочки?

В сценарии оболочки, который я видел, есть эта строка:

grep -e ERROR ${LOG_DIR_PATH}/${LOG_NAME}  > /dev/null
if [ $? -eq 0 ] 

person Oh Chin Boon    schedule 18.08.2011    source источник
comment
спасибо, Визард и Крис, отличные ответы, однако я могу выбрать только один ответ. ›‹   -  person Oh Chin Boon    schedule 18.08.2011
comment
Этот вопрос был задан и на него был дан ответ 18 августа 2011 г., но он закрыт, поскольку он аналогичен вопросу, заданному и на который был дан ответ 30 августа 2011 г. Почему мы разрешаем это o_o. Пожалуйста, проголосуйте, чтобы оставить это открытым   -  person Oh Chin Boon    schedule 03.12.2020
comment
Есть ли веская причина держать это открытым, например: есть ли разница с другим вопросом?   -  person Nico Haase    schedule 03.12.2020


Ответы (3)


Он проверяет возвращаемое значение ($?) grep. В этом случае он сравнивает его с 0 (успех).

Обычно, когда вы видите что-то подобное (проверка возвращаемого значения grep), он проверяет, была ли обнаружена конкретная строка. Хотя перенаправление на /dev/null не обязательно, то же самое можно сделать с помощью -q.

person Chris Eberle    schedule 18.08.2011
comment
Один вопрос, где находится /dev/null и что это такое? Это файл? - person Oh Chin Boon; 18.08.2011
comment
/dev/null — это своего рода специальный файл черной дыры. Когда вы пишете в него, данные выбрасываются. Это классический способ запретить программе вывод вывода на экран. - person Chris Eberle; 18.08.2011
comment
Чтобы добавить к комментарию @Chris, /dev/null означает нулевое устройство. Когда я думаю о том, что такое /dev/null на самом деле, это не кажется таким уж хорошим выбором для имени пользователя. - person Daniel Haley; 18.08.2011

$? — это статус выхода последней выполненной команды; по соглашению 0 означает успех, а все остальное указывает на неудачу. Эта строка проверяет успешность выполнения команды grep.

На справочной странице grep указано:

Статус выхода равен 0, если выбранные строки найдены, и 1, если не найдены. Если произошла ошибка, статус выхода равен 2. (Примечание: код обработки ошибок POSIX должен проверять наличие «2» или выше.)

Так что в этом случае он проверяет, были ли найдены какие-либо строки ERROR.

person Wyzard    schedule 18.08.2011
comment
Этот ответ более четко объяснен, чем принятый ответ. - person internetross; 26.12.2018

Это чрезвычайно часто используемый способ проверки успеха/неудачи команды. Как правило, фрагмент кода, который вы даете, будет реорганизован следующим образом:

if grep -e ERROR ${LOG_DIR_PATH}/${LOG_NAME} > /dev/null; then
   ...
fi

(Хотя вы можете использовать «grep -q» в некоторых случаях вместо перенаправления на /dev/null, это не переносимо. Многие реализации grep не поддерживают параметр -q, поэтому ваш сценарий может завершиться ошибкой, если вы его используете. )

person William Pursell    schedule 18.08.2011