linux instalar [: Operador inesperado na programação de shell



cygwin for linux (6)

Esta questão já tem uma resposta aqui:

Meu código:

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

Mas quando eu executo

    sh ./choose.sh

terminal me avisar que

   [: 4: n: :Unexpected operator
   [: 5: n: :Unexpected operator

Existe algum erro no meu script bash? Obrigado!


Answer #1

Não há erro no seu script bash . Mas você está executando com sh que tem uma sintaxe menos extensa;)

Então, execute bash ./choose.sh vez disso :)


Answer #2

você pode usar case / esac ao invés de if / else

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

Answer #3

Não use qualquer palavra-chave reservada como o início de qualquer nome de variável: por exemplo, HOSTNAME falhará quando HOST {TYPE | NAME} estiver reservado


Answer #4

POSIX sh não entende == para igualdade de string, já que isso é um ismo bash . Use = vez disso.

As outras pessoas dizendo que os suportes não são suportados por eles estão erradas, btw.


Answer #5

Na verdade, o "[" colchete de abertura quadrado é apenas um alias de shell interno para o comando de teste.

Então você pode dizer:

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

ou

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

... eles são equivalentes em sh ou bash. Observe o requisito de ter um colchete "]" de fechamento no comando "[", mas diferente de "[" é o mesmo que "teste"). "man test" é uma boa coisa para se ler.


Answer #6

Para executá-lo com o Bash, use #! / Bin / bash e chmod para ser executável, então use

./choose.sh




shell