В Bash, если [-z “$ 1”] и [[$ 1 ”=“ ”] одно и то же?

28

В скриптах оболочки Bash, в чем разница (если таковая имеется) между следующими двумя операторами?

    1.) if [ -z "$1" ]
    2.) if [ "$1" = "" ]

Я обнаружил, что пишу второй в некоторых сценариях, но потом я прочитал здесь, что использование -zдостигает того же.

Если есть проблемы с использованием второго, следует ли игнорировать, что первый выглядит немного лучше?

Johan
источник
3
Подробное сравнение см. В моем ответе о переполнении стека. Также посмотрите это и это .
Приостановлено до дальнейшего уведомления.
хорошие ссылки, с некоторыми хорошими ответами :)
Йохан

Ответы:

36

[ "$1" = "" ]и [ -z "$1" ]абсолютно эквивалентны в bash и других POSIX-совместимых оболочках. (Обратите внимание, что на каждой стороне скобок должен быть пробел, если только не присутствует символ, не входящий в состав слов, например ;.)

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

В КШ, Баш и Zsh, вы можете использовать синтаксис двойной кронштейн, [[ -z $1 ]]. Этот более новый синтаксис (он относится к концу 1980-х, а не к середине 1970-х годов) устраняет риск синтаксического анализа операндов в качестве операторов с помощью специальной синтаксической конструкции, а не обычной встроенной функции. Операторы должны появляться буквально, без кавычек в двойных скобках, и вам не нужно заключать переменные в двойные кавычки.

Жиль "ТАК - перестань быть злым"
источник
Исправлена ​​опечатка с отсутствующим пробелом рядом с скобкой.
Йохан