137 Stimmen

Integer-Vergleich in Bash, unärer Operator erwartet

Der folgende Code ergibt

[: -ge: unärer Operator erwartet

wenn

i=0

if [ $i -ge 2 ]
then
    #some code
fi

Warum?

295voto

vladr Punkte 63255

Ihr Problem ergibt sich aus der Tatsache, dass $i hat einen leeren Wert, wenn Ihre Anweisung fehlschlägt. Immer zitieren Ihre Variablen bei der Durchführung von Vergleichen, wenn auch nur die geringste Möglichkeit besteht, dass eine von ihnen leer sein könnte, z. B.:

if [ "$i" -ge 2 ] ; then
  ...
fi

Das liegt daran, wie die Shell mit Variablen umgeht. Nehmen wir das ursprüngliche Beispiel,

if [ $i -ge 2 ] ; then ...

Das erste, was die Shell bei der Ausführung dieser bestimmten Codezeile tut, ist, den Wert von $i genau wie bei Ihrem Lieblingsredakteur Suchen und Ersetzen funktionieren würde. Nehmen Sie also an, dass $i leer ist oder, noch anschaulicher, angenommen, dass $i ist ein Haufen von Leerzeichen! Die Shell ersetzt $i wie folgt:

if [     -ge 2 ] ; then ...

Jetzt, da die Variablenersetzungen abgeschlossen sind, fährt die Shell mit dem Vergleich fort und.... scheitert, weil sie nichts erkennen kann, was für die links von -gt . Allerdings, Zitat $i :

if [ "$i" -ge 2 ] ; then ...

wird:

if [ "    " -ge 2 ] ; then ...

Die Shell sieht jetzt die doppelten Anführungszeichen und weiß, dass Sie eigentlich vier Leerzeichen mit 2 vergleichen und überspringt die if .

Sie haben auch die Möglichkeit, einen Standardwert für $i wenn $i leer ist, wie folgt:

if [ "${i:-0}" -ge 2 ] ; then ...

Dadurch wird der Wert 0 anstelle von $i es $i ist undefiniert. Ich behalte die Anführungszeichen bei, denn auch hier gilt, wenn $i ist ein Haufen Leerzeichen, dann zählt es nicht als undefiniert wird sie nicht durch 0 ersetzt, und Sie stoßen erneut auf das Problem.

Bitte lesen diese wenn Sie die Zeit dazu haben. Die Shell wird von vielen wie eine Blackbox behandelt, aber sie funktioniert nach sehr wenigen und sehr einfachen Regeln - sobald Sie wissen, was diese Regeln sind (eine davon ist, wie Variablen in der Shell funktionieren, wie oben erklärt), hat die Shell keine Geheimnisse mehr für Sie.

7 Stimmen

Wird eine neue Fehlermeldung ausgelöst wie ganzzahliger Ausdruck erwartet

0 Stimmen

@Néstor falsch Eine Variable zu zitieren, führt NICHT zu einem neuen Fehler wie ganzzahliger Ausdruck erwartet wenn die Variable numerisch ist; Angabe eines nicht-numerischen Variablenwerts, ob in Anführungszeichen oder nicht, wird zu dem genannten Fehler führen.

6voto

starblue Punkte 53167

Nach der Fehlermeldung zu urteilen, war der Wert von i bei der Ausführung die leere Zeichenkette und nicht 0.

6voto

Roman Newaza Punkte 10771

Ich muss meine 5 Cents hinzufügen. Ich sehe, dass jeder verwendet [ o [[ aber es ist erwähnenswert, dass sie nicht Teil der if-Syntax sind.

Für arithmetische Vergleiche, verwenden Sie ((...)) stattdessen.

((...)) ist ein arithmetischer Befehl, der einen Exit-Status von 0 zurückgibt, wenn der Ausdruck nicht Null ist, oder 1, wenn der Ausdruck Null ist. Auch verwendet als Synonym für "let", wenn Seiteneffekte (Zuweisungen) erforderlich sind.

Siehe: ArithmetischerAusdruck

2voto

Fernando Miguélez Punkte 11068

Ihr Skript funktioniert einfach großartig. Sind Sie sicher, dass Sie "i" vor dem if nichts anderes zuweisen?

Ein häufiger Fehler ist auch, nach und vor den eckigen Klammern kein Leerzeichen zu lassen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X