Этот вопрос уже имеет ответ здесь:
Мой код:
#!/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 нет ошибок. Но вы выполняете его с помощью sh , который имеет менее обширный синтаксис;)
Итак, вместо этого запустите bash ./choose.sh
:)
вы должны использовать вместо этого bash или переписать ваш скрипт, используя стандартный sh
sh -c 'test "$choose" = "y" -o "$choose" = "Y"'
Фактически открывающая квадратная скобка «[» - это просто внутренний псевдоним оболочки для тестовой команды.
Итак, вы можете сказать:
test -f "/bin/bash" && echo "This system has a bash shell"
или
[ -f "/bin/bash" ] && echo "This system has a bash shell"
... они эквивалентны в sh или bash. Обратите внимание на требование иметь закрывающую скобку «]» в команде «[», но в остальном «[» то же самое, что и «test». "тест на человека" - хорошая вещь для чтения.
вы можете использовать case / esac вместо if / else
case "$choose" in
[yY]) echo "Yes" && exit;;
[nN]) echo "No" && exit;;
* ) echo "wrong input" && exit;;
esac
Чтобы выполнить его с помощью Bash, используйте #! / Bin / bash и chmod, чтобы он был исполняемым, затем используйте
./choose.sh
POSIX sh не понимает ==
для равенства строк, поскольку это bash-изм. Вместо этого используйте =
.
Другие люди, утверждающие, что скобки не поддерживаются sh, ошибаются.