Wie kann ich eine Variable in einer if / else-Anweisung mit einer Textzeichenfolge anstelle einer Ganzzahl vergleichen?


24

Beim Schreiben eines Shell-Skripts stieß ich auf ein Problem mit der folgenden if / else-Anweisung, die sich irgendwo in der Mitte des Skripts befindet:

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

Der zurückgegebene Fehler ist:

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

und fährt dann mit dem Rest des Skripts fort. Wie kann das if-Segment die Variable eher mit einer Zeichenfolge als mit einer Ganzzahl bewerten / vergleichen lassen? Bei der Verwendung von "! =" war unter anderem ein anderer Fehler erforderlich.

Antworten:


38

Etwas wie das:

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

-eqdient zum Vergleichen von Zahlen und zum Vergleichen =von Zeichenfolgen


Vielen Dank. Ich hatte das versucht, und das Skript wurde freigegeben, was einen Tastendruck erforderte, stellte jedoch nur fest, dass es durch einen nicht zusammenhängenden Syntaxfehler weiter unten verursacht wurde, sodass dies perfekt funktionierte. Danke für die Hilfe.
Tony_perkis666

3
@josephmarhee: Beachten Sie, dass der [[]]Test ein Bash-spezifisches Konstrukt ist und dieses Beispiel mit POSIX genauso gut funktioniert []wie in der Frage. Wenn der Interpreter explizit als #!/bin/bashoder ähnlich angegeben wird, [[]]kann der ohne Probleme verwendet werden (und es ist ein bisschen schneller als die Alternative in Bash , glaube ich - nicht, dass es sowieso ein Flaschenhals sein sollte), ansonsten sollte man bleiben []. Wenn man keine Bash-Angaben benötigt, läuft das Skript in zB Dash etwas schneller. Und POSIX stellt die inhärente Portabilität sicher.
Daniel Andersson

4

Diese Methode würde auch funktionieren. Sehr ähnlich zu @ Gurus Antwort, jedoch ohne doppelte eckige Klammern.

if [ "$act" == "add" ]
then
echo "Good!"
      else
      echo "Not good!"
fi
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.