В некоторых исторических оболочках реализован очень простой синтаксический анализатор, который может быть сбит с толку такими вещами, как, например, [ -n = "" ]
где первый операнд =
выглядит как оператор, и может анализировать это как [ -n = ]
или вызывать синтаксическую ошибку. В [ "x$1" = x"" ]
, на x
префикс гарантирует , что x"$1"
не может выглядеть как оператор, и поэтому единственным способом оболочка может разобрать этот тест является обработкой в =
качестве бинарного оператора.
Все современные оболочки и даже самые старые оболочки, все еще работающие, следуют правилам POSIX, которые обязывают правильно анализировать все тестовые выражения до 4 слов. Так [ -z "$1" ]
что это правильный способ проверки, если $1
пусто , и [ "$x" = "$y" ]
это правильный способ проверить равенство двух переменных.
Даже некоторые текущие оболочки могут быть перепутаны с более длинными выражениями, а некоторые выражения на самом деле неоднозначны, поэтому избегайте использования операторов -a
and -o
для создания более длинных логических тестов и вместо этого используйте отдельные вызовы для [
собственных &&
и ||
логических операторов оболочки .
Жиль "ТАК - перестань быть злым"
источник
sh
на некоторых коммерческих Unices, все еще имеют проблему. Смотрите здесь для деталей.[ -z "$1" ]
это правильный способ проверки, если$1
он пуст .sh -c '[ -z "$1" ]' ''; sh -c '[ -z "$1" ]'
- оба возвращают 0, но во втором случае$1
не могут быть пустыми, потому что его не существует.Согласно http://www.mpi-inf.mpg.de/~uwe/lehre/unixffb/quoting-guide.html ,
-z
тест является небезопасным в некоторых реализациях , предположительно, когда"-o a=a"
тестируются «интересные» строки, такие как.источник
Вышеуказанные тесты также вызовут ошибку, если вы запустите "set -u" или "set -o nounset"
Более стабильный способ проверить наличие пустой переменной - использовать расширение параметра :
MYVAR = $ {MYVAR: - "Неверное значение"}
Этот метод работает для традиционной оболочки Bourne, а также для ksh и bash.
источник
источник
=
против-z
, теперь как.