Bourne: если оператор проверяет статус выхода - PullRequest
4 голосов
/ 23 апреля 2010

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

if IsServerStarted ; then ...

и

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

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

Ответы [ 2 ]

9 голосов
/ 23 апреля 2010

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

if IsServerStarted ; then ...

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

if [ IsServerStarted -eq 0 ] ; then ...
0 голосов
/ 23 апреля 2010

На самом деле, вторая выдаст ошибку с жалобой на то, что IsServerStarted не является допустимым целым числом.Он считается строковой константой, поэтому что-то вроде

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

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

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

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

if $IsServerStarted ; then ...

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

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

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

...