В некоторых исторических оболочках реализован очень простой синтаксический анализатор, который может быть сбит с толку такими вещами, как, например, [ -n = "" ]
где первый операнд =
выглядит как оператор, и может анализировать это как [ -n = ]
или вызывать синтаксическую ошибку. В [ "x$1" = x"" ]
, на x
префикс гарантирует , что x"$1"
не может выглядеть как оператор, и поэтому единственным способом оболочка может разобрать этот тест является обработкой в =
качестве бинарного оператора.
Все современные оболочки и даже самые старые оболочки, все еще работающие, следуют правилам POSIX, которые обязывают правильно анализировать все тестовые выражения до 4 слов. Так [ -z "$1" ]
что это правильный способ проверки, если $1
пусто , и [ "$x" = "$y" ]
это правильный способ проверить равенство двух переменных.
Даже некоторые текущие оболочки могут быть перепутаны с более длинными выражениями, а некоторые выражения на самом деле неоднозначны, поэтому избегайте использования операторов -a
and -o
для создания более длинных логических тестов и вместо этого используйте отдельные вызовы для [
собственных &&
и ||
логических операторов оболочки .
sh
на некоторых коммерческих Unices, все еще имеют проблему. Смотрите здесь для деталей.