[
необходимо отделить пробелами от аргументов. ["$answer"
анализируется как одна команда с двумя аргументами, ==
и Y
. Такой команды не существует, поэтому она терпит неудачу, и ||
пытается выполнить следующую команду. Следующая команда - yes
: это команда, которая печатает свои аргументы бесконечно. Аргументы в этом случае: ==
и Yes
.
. Правильный способ записи условия:
if [ "$answer" == "Y" ] || [ "$answer" == "Yes" ] || [ "$answer" == "y" ] || [ "$answer" == "yes" ]
или
if [ "$answer" == "Y" -o "$answer" == "Yes" -o "$answer" == "y" -o "$answer" == "yes" ]
или, если вы используете bash
if [[ $answer == Y || $answer == Yes || $answer == y || $answer == yes ]]
Вы также можете использовать расширение параметров, чтобы ввести ответ в нижнем регистре (но он включает yEs
et c. среди принятых ответов)
if [[ ${answer,} == y || ${answer,,} == yes ]]
Или вы можете использовать регулярное выражение с оператором =~
if [[ ${answer,,} =~ ^y(es)?$ ]]
В shopt -s extglob
вы можете использовать шаблон для сопоставления обоих случаев в одном выражении:
if [[ ${answer,,} == y?(es) ]]