web-dev-qa-db-fra.com

[: Opérateur inattendu en programmation Shell

Mon code:

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

Mais quand j'exécute

    sh ./choose.sh

terminal invite moi que

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

Y a-t-il une erreur dans mon script bash? Merci!

167
kit.yang

Il n'y a pas d'erreur dans votre script bash. Mais vous l'exécutez avec sh qui a une syntaxe moins complète;)

Donc, lancez bash ./choose.sh à la place :)

291
Wolph

POSIX sh ne comprend pas == pour l'égalité des chaînes, car il s'agit d'un bash - ism. Utilisez = à la place.

Les autres personnes qui disent que les crochets ne sont pas pris en charge par sh ont tort, au fait.

268
Nietzche-jou

vous devez utiliser bash à la place ou réécrire votre script en utilisant sh standard

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

vous pouvez utiliser case/esac au lieu de if/else

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

Pour l'exécuter avec Bash, utilisez #!/Bin/bash et chmod pour l'exécuter, puis utilisez

./choose.sh
4
Jack Scott

En fait, le crochet d’ouverture carré [[] est un alias de shell interne pour la commande de test.

Alors vous pouvez dire:

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

ou

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

... ils sont équivalents en sh ou bash. Notez l'exigence d'avoir un crochet "]" de fermeture sur la commande "[" mais autre que celui "[" est identique à "test". "test de l'homme" est une bonne chose à lire.

3
delatbabel