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 the
if` пройдет или потерпит неудачу в зависимости от того, был ли ты вне удовольствия.
if [ $IsServerStarted -eq 0 ]; then ...
Это просто проверяет, равна ли переменная нулю. Если это не допустимое целое число, это вызовет сообщение об ошибке.