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.


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.


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.