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