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