2009-01-03 6 views

Antwort

1

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

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

6

aus der Fehlermeldung zu urteilen der Wert von i war die leere Zeichenkette, wenn Sie es ausgeführt wird, nicht 0

242

Ihr Problem ergibt sich aus der Tatsache, dass $i einen leeren Wert hat, wenn Ihre Aussage nicht. bitte immer Ihre Variablen, wenn Vergleiche durchführen, wenn auch nur die geringste Chance, dass einer von ihnen leer sein kann, z.B .:

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

Dies liegt daran, wie die Shell behandelt Variablen. Nehmen wir das ursprüngliche Beispiel

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

Das erste, was die Shell tut, wenn diese bestimmte Codezeile ausgeführt wird ersetzen Sie den Wert von $i, genau wie Ihre Lieblings Redakteur Suche & ersetzen Funktion würde. Nehmen wir an, $i ist leer oder, noch anschaulicher, nehmen wir an, dass $i eine Menge Leerzeichen ist! Die Shell ersetzt $i wie folgt:

if [  -ge 2 ] ; then ... 

Nun, da die variable Substitutionen sind fertig, die Schale fährt mit dem Vergleich und .... schlägt fehl, weil es nicht alles verständlich die von -gt links sehen können. Allerdings zitiert $i:

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

wird:

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

Die Hülle sieht nun die doppelte Anführungszeichen, und weiß, dass man tatsächlich vier Rohlinge 2 vergleichen und die if überspringen.

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

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

Dies wird den Wert ersetzen 0 statt $i ist $i nicht definiert ist. Ich habe immer noch die Anführungszeichen, denn wenn $i ein Bündel von Leerzeichen ist, dann zählt es nicht als undefined, es wird nicht durch 0 ersetzt, und Sie werden das Problem noch einmal auftreten.

Bitte lesen Sie this, wenn Sie die Zeit haben.Die Shell wird von vielen wie eine Blackbox behandelt, aber sie arbeitet mit 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), wird die Shell habe keine Geheimnisse mehr für dich.

+4

Variable zitiert wird ** –

+0

@ Néstor ** ** falsch, zitiert eine Variable erwartet einen neuen Fehler wie ** Integer-Ausdruck steigen keinen neuen Fehler wie * Integer-Ausdruck erhöhen erwartet * wenn die Variable numerisch ist; Wenn Sie einen nicht numerischen Variablenwert angeben, egal ob in Anführungszeichen oder nicht, * wird * der Fehler angezeigt. – vladr

+1

Ich habe versucht, in diesem Moment und ich habe diesen Fehler. –

6

Ich muss meine 5 Cent hinzufügen. Ich sehe alle verwenden [ oder [[, aber es ist erwähnenswert, dass sie nicht Teil der Syntax sind.

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

((...)) ist ein arithmetischer Befehl, der einen Exit-Status von 0, wenn gibt den Ausdruck nicht Null ist, oder 1, wenn der Ausdruck gleich Null ist. Wird auch als Synonym für "let" verwendet, wenn Nebenwirkungen (Zuweisungen) benötigt werden.

See: ArithmeticExpression