Всегда ли [«$ VAR» = «»] и [-z «$ VAR»] эквивалентны?

8

Мой код выглядит примерно так:

VAR=""

while [ -z "$VAR" ]; do
  VAR=$( command | grep "important_string" )
done

Поэтому я хочу опрашивать вывод command, пока не important_stringпоявится и не введен в $VAR.

Есть ли функциональная разница между [ -z "$VAR" ]и [ "$VAR" = "" ]?

Minix
источник
3
==неверный синтаксис, но работает во многих оболочках (вероятно, потому что это мышечная память для всех, кто использует другие языки). Вы должны использовать =.
10
@ l0b0 скопировал ==откуда-то. Моя ошибка.
Minix

Ответы:

5

Да, они ( [ -z "$VAR" ]и [ "$VAR" = "" ]...) эквивалентны. Оба проверяют пустоту $VAR(например, когда она не связана или установлена ​​в пустую строку).

Как прокомментировал Celada , плохие вещи могут произойти при использовании [ "$VAR" = "" ] if, если VARкакой-то действительный тест (например, если VARесть -z), в частности, когда [(или test) не является встроенной оболочкой. Но bashили является встроенной и что , кажется, не является проблемой. Вы могли бы использовать для своего теста. Смотрите тест (1)zsh[[ "x$VAR" = "x" ]

Конечно, я предполагаю некоторую оболочку POSIX или что-то подобное.

Возможно, это -zможет быть немного быстрее (но вам не нужно заботиться о микросекундах в сценариях оболочки), и вы, возможно, найдете =более читабельным.

Василий Старынкевич
источник
5
Хотя я наверняка [ "$VAR" = "" ]ошибался, потому что если бы содержимое $VARбыло начинаться с дефиса, то это привело бы к синтаксической ошибке, например, если $VARсодержит, -zто расширилось бы до [ -z = "" ]- будет ли этот тест =пустым (что не так) а потом трактовать ""как посторонний аргумент? Но я не могу заставить его потерпеть неудачу таким образом, когда я попробую это после прочтения вашего ответа! Я использую такие контракты, как [ "x$VAR" = "xfoo" ]защита от специальных символов в $VARтечение десятилетий, возможно, излишне!
Селада
@Celada: я думаю, что ваша точка зрения верна для редких раковин, где testнет встроенных.
Василий Старынкевич
1
Я думаю, что в отношении расширений встроенные функции оболочки должны вести себя так же, как внешние команды. Разве вы не путали это с ключевыми словами, как [[в bash? Они действительно разные. --- Я не наблюдаю какого-либо особого поведения в отношении расширения переменных при помощи testвстроенной команды bash.
Пабук
Я проверил сzsh
Василий Starynkevitch
@ Селада, на самом деле, вы правы, есть так много вещей, которые могут пойти не так, если использовать их [ "$VAR" = "" ], поэтому безопаснее использовать -z.
Брайам