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!
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 :)
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.
vous devez utiliser bash à la place ou réécrire votre script en utilisant sh standard
sh -c 'test "$choose" = "y" -o "$choose" = "Y"'
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
Pour l'exécuter avec Bash, utilisez #!/Bin/bash et chmod pour l'exécuter, puis utilisez
./choose.sh
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.