Мой код:
#!/bin/sh
#filename:choose.sh
read choose
[ "$choose" == "y" -o "$choose" == "Y" ] && echo "Yes" && exit 0
[ "$choose" == "n" -o "$choose" == "N" ] && echo "No" && exit 0
echo "Wrong Input" && exit 0
Но когда я выполняю
sh ./choose.sh
сообщите мне, что
[: 4: n: :Unexpected operator
[: 5: n: :Unexpected operator
Есть ли ошибка в моем bash script? Спасибо!
В вашем bash script нет ошибки. Но вы выполняете его с sh, который имеет менее обширный синтаксис;)
Итак, запустите bash ./choose.sh
вместо:)
bash
- это расширенный набор синтаксиса sh
- исполняемый файл /bin/sh
в вашей системе может предоставлять только стандартные функции sh
, в которые не включены тесты в стиле []
.
POSIX sh не понимает ==
для равенства строк, так как это bash -ism. Вместо этого используйте =
.
Другие люди, говорящие, что скобки не поддерживаются sh, неверны, btw.
В вашем коде замените эту строку:
#!/bin/sh
с
#!/bin/bash
Это должна быть первая строка вашего скрипта и указывает, какую оболочку linux нужно использовать. sh не поддерживает те же команды, что и bash.
И тогда вы можете вызвать ваш скрипт напрямую (он должен быть исполняемым):
./choose.sh
или с
bash ./choose.sh
sh не будет работать, так как это bash-скрипт. Ответ от Ницше будет работать с ш.
вы можете использовать case/esac вместо if/else
case "$choose" in
[yY]) echo "Yes" && exit;;
[nN]) echo "No" && exit;;
* ) echo "wrong input" && exit;;
esac
вместо этого вы должны использовать bash или переписать script с помощью стандартного sh
sh -c 'test "$choose" = "y" -o "$choose" = "Y"'
Чтобы выполнить его с помощью Bash, используйте #!/bin/bash и chmod для его выполнения, затем используйте
./choose.sh
Фактически "квадратная открывающая скобка" - это всего лишь внутренний псевдоним оболочки для тестовой команды.
Итак, вы можете сказать:
test -f "/bin/bash" && echo "This system has a bash shell"
или
[ -f "/bin/bash" ] && echo "This system has a bash shell"
... они эквивалентны либо sh, либо bash. Обратите внимание на требование наличия закрывающей "]" скобки в команде "[", но кроме этого "[" совпадает с "тестом" ). "тест человека" - хорошая вещь для чтения.
man test
- это справочная страница / bin / test, а не встроенной функции оболочки
ls $(which [)
дает /usr/bin/[
Не используйте зарезервированное ключевое слово в качестве начала любого имени переменной: например HOSTNAME завершится неудачно, поскольку HOST {TYPE | NAME} зарезервированы
sh
сbash
. В некоторых дистрибутивах больше нет настоящегоsh
. Хотя некоторые будут утверждать (и я склонен согласиться), что если вы пишете скрипт для переносимости, пишите его вsh
вместоbash
.