Stringvergleich in Shell

4

Ich versuche, den aktuellen Monat, den ich vom Datumsprogramm erhalten habe, mit der Benutzereingabe zu vergleichen. Selbst wenn ich Oct als Eingabe gebe, ist das Ergebnis falsch.

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

Ich kann nicht verstehen, warum es immer no als Ausgabe gibt. Jede Hilfe wird geschätzt.

Prashast
quelle
1
Wenn Sie Ihr Skript mit einem Nicht-ASCII-Editor erstellen, sollten Sie zu einem ASCII / UTF8 wechseln und die regulären Anführungszeichen ( ") und nicht die anderen ( ) verwenden
Olivier Dulac

Antworten:

2

Wenn Sie Ihren Code ausführen und Octan der Eingabeaufforderung Folgendes eingeben, erhalten Sie:

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

Wenn Sie ”Oct”den Vergleich eingeben, ist dies offensichtlich richtig:

”Oct”
”Oct”
match

Wenn Sie die beiden schließenden Anführungszeichen nicht eingeben möchten , entfernen Sie sie einfach aus der Vergleichszeichenfolge:

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

Auf diese Weise können Sie einfach OctFolgendes eingeben Oct:

Oct
Oct
match

Wenn Sie Ihr Programm weiter entwickeln wollen, könnte der nächste Schritt sein , den Vergleich Groß- und Kleinschreibung zu machen: auf diese Weise Ihre Benutzer geben könnten oct, Octoder OCTohne den richtigen Fall zu kümmern.

simlev
quelle
2

Es gibt einen sehr offensichtlichen Fehler in Ihrem Code.

Sie sind die Anführungszeichen um das Datumsformat

current=`date +”%b”`

vs

current=`date +"%b"` # this is the one you should be using
td512
quelle
Also muss ich das Zitat aus dem Datum entfernen und dann vergleichen, richtig?
Prashast
3
+1, weil Sie das Anführungszeichenproblem behoben haben. Allerdings denke ich, dass im Vergleich dazu nichts falsch ist= .
Kamil Maciorowski
7
[ "$month" = "$current" ]ist vollkommen in Ordnung und wohl korrekter als [ "$month" == "$current" ]weil das erstere POSIX ist und das letztere nicht. Führen Sie dash -c '[ a == a ]] && echo yes'zum Beispiel. =vs ==ist ein C-ähnliches Problem, [s =und ==sind normalerweise gleichwertig, wenn beide unterstützt werden.
Muru
(Argh, Tippfehler in meinem Beispiel! Das ]]sollte sein ].)
muru
2
@muru ist richtig: verwenden if [ "$month" = "$current" ];. Verwenden Sie nicht das ==. Das Problem ergab sich aus der Tatsache, dass OP 2 zusätzliche Zeichen hinzufügte: zu $ current, daher konnten die 2 Daten nicht gleich sein.
Olivier Dulac