Comparaison de chaînes dans le shell

4

J'essaie de comparer le mois en cours que j'ai obtenu de l'utilitaire de date avec la saisie de l'utilisateur. Même lorsque je donne Oct comme entrée, cela donne un résultat incorrect.

read -r month
current=`date +”%b”`
echo $current
if [ "$month" = "$current" ];
then
    echo "match"
else
    echo "no "
fi

Je ne suis pas en mesure de comprendre pourquoi sa donne toujours comme sortie. Toute aide est appréciée.

Prashast
la source
1
Vous utilisez un éditeur non-ASCII pour créer votre script, vous devez passer à un éditeur ascii / utf8 et utiliser les guillemets ordinaires ( " ) et non les autres ( )
Olivier Dulac

Réponses:

2

En exécutant votre code et en entrant Oct à l'invite, vous obtenez:

Oct         # this is what you input at the prompt
”Oct”       # this is what your input is compared against
no          # this is the result of the comparison: not true

Evidemment, si vous avez entré ”Oct” la comparaison serait vraie:

”Oct”
”Oct”
match

Si vous ne voulez pas taper les deux fermeture des guillemets , supprimez-les simplement de la chaîne de comparaison:

read -r month
current=`date +%b`
echo $current
if [ "$month" = "$current" ];
then
    echo "match"
else
    echo "no "
fi

De cette façon, vous pouvez simplement taper Oct et ça va correspondre Oct:

Oct
Oct
match

Si vous souhaitez développer davantage votre programme, l'étape suivante pourrait consister à rendre la comparaison insensible à la casse: ainsi, vos utilisateurs pourront taper oct, Oct ou OCT sans se soucier de l'affaire appropriée.

simlev
la source
2

Il y a une erreur très évidente dans votre code.

Ce sont les guillemets autour du format de date

current=`date +”%b”`

contre

current=`date +"%b"` # this is the one you should be using
td512
la source
Je dois donc supprimer la citation de la date & amp; puis comparer, non?
Prashast
3
+1 parce que vous avez résolu le problème des guillemets. Cependant je pense il n'y a rien de mal en comparaison avec =.
Kamil Maciorowski
7
[ "$month" = "$current" ] est parfaitement correct et sans doute plus correct que [ "$month" == "$current" ] parce que le premier est POSIX et ce dernier ne l'est pas. Courir dash -c '[ a == a ]] && echo yes' par exemple. = contre == est un problème de type C, [ s = et == sont généralement équivalents lorsque les deux sont pris en charge.
muru
(Argh, faute de frappe dans mon exemple! Le ]] devrait être ].)
muru
2
@muru a raison: utiliser if [ "$month" = "$current" ]; . Ne pas utiliser le ==. Le problème vient du fait que OP a ajouté 2 caractères supplémentaires: to $ current, les 2 dates ne peuvent donc pas être égales.
Olivier Dulac