[ "$1" = "" ]
и [ -z "$1" ]
абсолютно эквивалентны в bash и других POSIX-совместимых оболочках. (Обратите внимание, что на каждой стороне скобок должен быть пробел, если только не присутствует символ, не входящий в состав слов, например ;
.)
[
является встроенной оболочкой, как и любая другая; на самом деле это также может быть записано test
(единственное различие между ними заключается в том, что последний аргумент [
требует a ]
). Так что, если вы бежите [ "$1" = "" ]
с $1
расширением до -z
, оператор теста видит три аргумента: -z
, =
и пустую строку. Некоторые старые оболочки Борна иногда выдавали ошибки синтаксического анализа, когда операнд выглядел как оператор таким образом, даже если в полном выражении не было двусмысленности. Я не знаю, действительно ли какая-либо версия имела проблемы с этим конкретным выражением, но более сложные выражения могли бы их отбросить. Также могли быть версии, которые имели проблемы с пустыми словами; они бы тоже не поддержали [ -z "$1" ]
. Распространенная идиома[ x"$1" = x"" ]
, Это исключает риск разбора операндов как операторов, поскольку ни один оператор не начинается с буквы.
В КШ, Баш и Zsh, вы можете использовать синтаксис двойной кронштейн, [[ -z $1 ]]
. Этот более новый синтаксис (он относится к концу 1980-х, а не к середине 1970-х годов) устраняет риск синтаксического анализа операндов в качестве операторов с помощью специальной синтаксической конструкции, а не обычной встроенной функции. Операторы должны появляться буквально, без кавычек в двойных скобках, и вам не нужно заключать переменные в двойные кавычки.