Мой код выглядит примерно так:
VAR=""
while [ -z "$VAR" ]; do
VAR=$( command | grep "important_string" )
done
Поэтому я хочу опрашивать вывод command
, пока не important_string
появится и не введен в $VAR
.
Есть ли функциональная разница между [ -z "$VAR" ]
и [ "$VAR" = "" ]
?
shell-script
Minix
источник
источник
==
неверный синтаксис, но работает во многих оболочках (вероятно, потому что это мышечная память для всех, кто использует другие языки). Вы должны использовать=
.==
откуда-то. Моя ошибка.Ответы:
Да, они (
[ -z "$VAR" ]
и[ "$VAR" = "" ]
...) эквивалентны. Оба проверяют пустоту$VAR
(например, когда она не связана или установлена в пустую строку).Как прокомментировал Celada , плохие вещи могут произойти при использовании
[ "$VAR" = "" ]
if, еслиVAR
какой-то действительный тест (например, еслиVAR
есть-z
), в частности, когда[
(илиtest
) не является встроенной оболочкой. Ноbash
или является встроенной и что , кажется, не является проблемой. Вы могли бы использовать для своего теста. Смотрите тест (1)zsh
[
[ "x$VAR" = "x" ]
Конечно, я предполагаю некоторую оболочку POSIX или что-то подобное.
Возможно, это
-z
может быть немного быстрее (но вам не нужно заботиться о микросекундах в сценариях оболочки), и вы, возможно, найдете=
более читабельным.источник
[ "$VAR" = "" ]
ошибался, потому что если бы содержимое$VAR
было начинаться с дефиса, то это привело бы к синтаксической ошибке, например, если$VAR
содержит,-z
то расширилось бы до[ -z = "" ]
- будет ли этот тест=
пустым (что не так) а потом трактовать""
как посторонний аргумент? Но я не могу заставить его потерпеть неудачу таким образом, когда я попробую это после прочтения вашего ответа! Я использую такие контракты, как[ "x$VAR" = "xfoo" ]
защита от специальных символов в$VAR
течение десятилетий, возможно, излишне!test
нет встроенных.[[
в bash? Они действительно разные. --- Я не наблюдаю какого-либо особого поведения в отношении расширения переменных при помощиtest
встроенной команды bash.zsh
[ "$VAR" = "" ]
, поэтому безопаснее использовать-z
.