Comment puis-je comparer une variable à une chaîne de texte, plutôt qu'à un entier, dans une instruction if / else?


24

Lors de l'écriture d'un script shell, j'ai rencontré un problème avec l'instruction if / else suivante qui se situe quelque part au milieu du script:

if [ $act -eq "add" ]
then
    read - "add or update: " $comm
    git commit -m "$comm $file"
else
    git commit -m "$act $file"
fi

L'erreur de retour étant:

./gitup: line 13: [: add: integer expression expected

puis continue avec le reste du script. Comment puis-je avoir le segment if évaluer / comparer la variable à une entrée de chaîne plutôt qu'à un entier; une erreur différente était requise lors de l'utilisation de "! =" parmi quelques autres choses que j'ai essayées.

Réponses:


38

Quelque chose comme ça:

act="add"
if [[ $act = "add" ]]
then
    echo good
else
    echo not good
fi

-eqest pour la comparaison des nombres, utilisez =pour la comparaison des chaînes


Merci. J'avais essayé cela, et le script serait gratuit, nécessitant une frappe, mais je viens de découvrir qu'il était causé par une erreur de syntaxe non liée plus bas, donc cela fonctionnait parfaitement. Merci pour l'aide.
tony_perkis666

3
@josephmarhee: Notez que le [[]]test est une construction spécifique à Bash, et cet exemple fonctionne aussi bien avec le POSIX []que celui utilisé dans la question. Si l'interpréteur est explicitement donné comme #!/bin/bashou similaire, le [[]]peut être utilisé sans problème (et c'est un peu plus rapide que l'alternative dans Bash , je crois - pas que ce soit de toute façon un goulot d'étranglement), sinon on devrait s'en tenir []. Si l'on n'a pas du tout besoin des spécificités de Bash, le script s'exécutera un peu plus rapidement, par exemple dans Dash. Et POSIX garantit une portabilité inhérente.
Daniel Andersson

4

Cette méthode fonctionnerait également. Très similaire à la réponse de @ Guru mais supprime le besoin de crochets doubles.

if [ "$act" == "add" ]
then
echo "Good!"
      else
      echo "Not good!"
fi
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.