Подтвердить что ты не робот

[: Неожиданный оператор в программировании оболочки

Мой код:

    #!/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? Спасибо!

4b9b3361

Ответ 1

В вашем bash script нет ошибки. Но вы выполняете его с sh, который имеет менее обширный синтаксис;)

Итак, запустите bash ./choose.sh вместо:)

Ответ 2

POSIX sh не понимает == для равенства строк, так как это bash -ism. Вместо этого используйте =.

Другие люди, говорящие, что скобки не поддерживаются sh, неверны, btw.

Ответ 3

В вашем коде замените эту строку:

#!/bin/sh

с

#!/bin/bash

Это должна быть первая строка вашего скрипта и указывает, какую оболочку linux нужно использовать. sh не поддерживает те же команды, что и bash.

И тогда вы можете вызвать ваш скрипт напрямую (он должен быть исполняемым):

./choose.sh

или с

bash ./choose.sh

sh не будет работать, так как это bash-скрипт. Ответ от Ницше будет работать с ш.

Ответ 4

вместо этого вы должны использовать bash или переписать script с помощью стандартного sh

sh -c 'test "$choose" = "y" -o "$choose" = "Y"'

Ответ 5

вы можете использовать case/esac вместо if/else

case "$choose" in
  [yY]) echo "Yes" && exit;;
  [nN]) echo "No" && exit;;
  * ) echo "wrong input" && exit;;
esac

Ответ 6

Чтобы выполнить его с помощью Bash, используйте #!/bin/bash и chmod для его выполнения, затем используйте

./choose.sh

Ответ 7

Фактически "квадратная открывающая скобка" - это всего лишь внутренний псевдоним оболочки для тестовой команды.

Итак, вы можете сказать:

test -f "/bin/bash" && echo "This system has a bash shell"

или

[ -f "/bin/bash" ] && echo "This system has a bash shell"

... они эквивалентны либо sh, либо bash. Обратите внимание на требование наличия закрывающей "]" скобки в команде "[", но кроме этого "[" совпадает с "тестом" ). "тест человека" - хорошая вещь для чтения.

Ответ 8

Не используйте зарезервированное ключевое слово в качестве начала любого имени переменной: например HOSTNAME завершится неудачно, поскольку HOST {TYPE | NAME} зарезервированы