В bash, почему, если [1] не терпит неудачу? - PullRequest
3 голосов
/ 13 ноября 2011

В сценариях оболочки (bash), почему условие удовлетворяется

if [ 1 ]
then
 echo should not enter
fi

#Output
should not enter

Ответы [ 3 ]

7 голосов
/ 13 ноября 2011

Квадратные скобки в bash эквивалентны вызову test с аргументами в скобках.man test говорит, что

STRING эквивалентно -n STRING

и

-n STRING длина STRING отлична от нуля

, а 1 не является пустой строкой.if [ 0 ], if [ false ] и if [ no ] имеют одинаковый результат, а if [ "" ] - нет.

2 голосов
/ 13 ноября 2011

Что может быть неочевидным, так это то, что эти два очень различны:

if [ false ]

и

if false

Первый, как Титон и Игнасио Васкес-Абрамс, скажем, неявно проверяет, является ли строка false пустой.Вторая версия проверяет состояние выхода команды false.(Тестирование состояния выхода в буквальном смысле не является истинным / ложным тестом. Оно проверяет успех или неудачу, как представлено числовыми кодами. Как вы можете себе представить, состояние выхода false всегда является ошибкой. Это его работа.)

Более подробно об этом можно узнать из BashGuide на Вики Грега .

1 голос
/ 13 ноября 2011

Потому что 1 не является пустой строкой; в нем есть один символ, который является цифрой "1".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...