Bourne: если оператор тестирует статус выхода

В чем разница:

if IsServerStarted ; then ...

а также

if [ IsServerStarted -eq 0 ] ; then ...

Мне кажется, что эти два утверждения должны быть эквивалентны? Странно, что второе утверждение всегда верно.

2 ответа

Решение

Следующее запускает функцию оболочки или исполняемый файл в $PATH названный IsServerStartedи если его код выхода 0 (т.е. верно), запускает then ветка. Если такой функции или исполняемого файла не существует, код выхода будет не0 (то есть ложь) и then ветка будет пропущена.

if IsServerStarted ; then ...

Следующее имеет [ (ака test) проверить, IsServerStarted целое число, равное 0, который (IsServerStarted даже не содержит ни одной цифры) всегда ложно. Таким образом, [ выходы с0 (т.е. ложный) код и then ветка всегда пропускается.

if [ IsServerStarted -eq 0 ] ; then ...

На самом деле, вторая выдаст ошибку, сообщающую, что "IsServerStarted" не является допустимым целым числом. Это считается строковой константой, так что-то вроде

var="IsServerStarted"
if [ IsServerStarted == "$var" ] ; then

будет успешным (или потерпит неудачу, если он не будет равен).

ndim верен в отношении исполняемого файла или функции в первом приведенном вами примере.

Еще пара вариантов для рассмотрения:

if $IsServerStarted ; then ...

В этом if оценивается на основе возвращаемого значения команды (исполняемого файла или функции), содержащейся в переменной IsServerStarted, Чтобы вы могли установить IsServerStarted=true а затем if будет успешным, так как true встроенная оболочка, которая всегда возвращает true Вы могли бы установить IsServerStarted='grep popsicle freezer' and theif` пройдет или потерпит неудачу в зависимости от того, был ли ты вне удовольствия.

if [ $IsServerStarted -eq 0 ]; then ...

Это просто проверяет, равна ли переменная нулю. Если это не допустимое целое число, это вызовет сообщение об ошибке.

Другие вопросы по тегам