Проблема sh:xxx:[:xxx: неожиданный оператор возникает при оценке равенства строк в среде Ununtu

предисловие

Это небольшая проблема.Основная причина заключается в том, что для определения равенства символов в среде ==необходимо bash, а Ubuntu по умолчанию не является средой оболочки, поэтому будет проблема, что оболочка, которая хорошо работает на CentOS будет работать некорректно на Ubuntu.Суть проблемы, с которой я столкнулся, также является причиной, но в сложной ситуации я не могу понять, где причина, на первый взгляд.

Живая реставрация

Для того, чтобы выяснить причину этой проблемы, я убрал всю неактуальную логику, и появилось следующее a.shи b.shдва скрипта:

#!/bin/bash

VAL=$1

sh ./b.sh $VAL
#!/bin/bash

VAL=$1

if [ $VAL == "1" ] ; then
    echo "find it"
fi

echo "end"

Учитывая проблему совместимости, я написал это в начале #!/bin/bash, пусть он выполняется bash по умолчанию, чтобы у меня все было хорошо, независимо от того, нахожусь ли я на Ununtu или на других версиях Linux, но это не так.Результаты выполнения следующее:

root@demo:~# ./a.sh fly
./b.sh: 5: [: fly: unexpected operator
end

Если у вас есть острый глаз, вы можете увидеть это с первого взгляда.Проблема заключается в sh ./b.sh $VALэтом предложении, которое делает не#!/bin/bash работает.Сценарий , выполняемый этой оболочкой, поэтому использование, чтобы судить о том, что строки равны, сообщит об ошибке.shb.sh==

В данном примере это легко найти, а вот в сложных скриптах в реальной работе найти сложнее.Прочитав отчёт об ошибке, ./b.sh: 5я не проблем, так как обнаружил, что это может быть вызвано синтаксисом оболочки под Система Ubuntu. Я также пробовал много раз. Я изменил его на один знак равенства в первый раз, и другие методы сравнения строк все еще сообщали об ошибках, но когда я обнаружил проблему, я смог заставить ее выполняться правильно независимо от один знак равенства или два знака равенства, просто успокойся

Подведем итог

  • Использование ==для определения равенства строк - это bashсинтаксис в
  • Символ в начале сценария оболочки #!/bin/bashозначает, что если тип оболочки не указан при выполнении сценария, он будет выполнен с указанной оболочкой.
  • Когда вы сталкиваетесь с проблемой, вам нужно успокоиться и решать ее медленно, избегая хаоса в спешке.
==>> Ссылка против лазания, пожалуйста, не нажимайте, она взорвется на месте, и мы не несем за это ответственности! <<==

Некоторые люди истощили всю свою энергию, чтобы выжить, так на что еще им положиться в борьбе с судьбой~

おすすめ

転載: blog.csdn.net/shihengzhen101/article/details/129629916