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