Wann wird die Schleife, die mit while [ -n "$1" ]; beginnt, ausgeführt?

Wann wird die Schleife, die mit while [ -n "$1" ]; beginnt, ausgeführt?

Ich habe ein Shell-Skript mit while-Schleife beginnend mit

while [ -n "$1" ]; do

Ich weiß, dass sich das $1auf das Argument direkt nach dem Namen des Skripts bezieht, also firstargumentwenn ich es ausführe ./myscript.sh firstargument. Was machen die -n?

Antwort1

Dies -nist ein Test für eine nicht leere Zeichenfolge.

Wenn die "$1"Erweiterung eine leere Zeichenfolge ergibt, schlägt der entsprechende Test fehl und die Schleife wird nicht ausgeführt.

Es istwahrscheinlichdass der Hauptteil der Schleife eine shiftAnweisung zum Verschieben des nächsten Positionsparameters enthält $1und dass die Schleife auf diese Weise die Argumente des Skripts durchläuft, bis sie ein leeres Argument findet oder das Ende der Argumentenliste erreicht.

Das testDienstprogramm entspricht [, erfordert aber [, dass das letzte Argument ist ].

Der Test könnte auch wie folgt geschrieben werden:

while test -n "$1"; do

Sowohl [als auch testsind wahrscheinlich in Ihre Shell integriert, sollten aber auch als externe Befehle unter einem Standardpfad wie verfügbar sein /bin.

Weitere Informationen zu diesem und anderen Tests finden Sie in man testsowie im Handbuch für Ihre Shell (da es sich um ein integriertes Dienstprogramm handelt).

Dieser -nTest ist auch einer derStandardPrüfungen und sind daher auch gelistet inder POSIX-Standard für das testDienstprogramm.


WennDiese Schleife soll überalleArgumente des Shell-Skripts, dann schlägt dies möglicherweise fehl, wenn ein Argument leer ist:

$ sh -c 'while [ -n "$1" ]; do printf "arg: %s\n" "$1"; shift; done' sh 1 2 3 "" 4 5 6
arg: 1
arg: 2
arg: 3

Stattdessen sollte es möglicherweise etwas wie

for arg do
    if [ -n "$arg" ]; then
        # do something with "$arg"
    fi
done

... hängt natürlich davon ab, was das Skript macht.

verwandte Informationen