Der folgende Code ergibt
[: -ge: unärer Operator erwartet
wenn
i=0
if [ $i -ge 2 ]
then
#some code
fi
Warum?
Der folgende Code ergibt
[: -ge: unärer Operator erwartet
wenn
i=0
if [ $i -ge 2 ]
then
#some code
fi
Warum?
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.
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
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.