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

Этот вопрос уже имеет ответ здесь:

Мой код:

    #!/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

Есть ли в моем сценарии удара ошибка?Спасибо!

173
задан kit.yang 5 August 2010 в 01:23
поделиться

6 ответов

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

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

296
ответ дан 23 November 2019 в 20:34
поделиться

вы должны использовать вместо этого bash или переписать ваш скрипт, используя стандартный sh

sh -c 'test "$choose" = "y" -o "$choose" = "Y"'
5
ответ дан 23 November 2019 в 20:34
поделиться

Фактически открывающая квадратная скобка «[» - это просто внутренний псевдоним оболочки для тестовой команды.

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

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

или

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

... они эквивалентны в sh или bash. Обратите внимание на требование иметь закрывающую скобку «]» в команде «[», но в остальном «[» то же самое, что и «test». "тест на человека" - хорошая вещь для чтения.

3
ответ дан 23 November 2019 в 20:34
поделиться

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

case "$choose" in
  [yY]) echo "Yes" && exit;;
  [nN]) echo "No" && exit;;
  * ) echo "wrong input" && exit;;
esac
5
ответ дан 23 November 2019 в 20:34
поделиться

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

./choose.sh
4
ответ дан 23 November 2019 в 20:34
поделиться

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

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

280
ответ дан 23 November 2019 в 20:34
поделиться