![Wann wird die Schleife, die mit while [ -n "$1" ]; beginnt, ausgeführt?](https://rvso.com/image/146500/Wann%20wird%20die%20Schleife%2C%20die%20mit%20while%20%5B%20-n%20%22%241%22%20%5D%3B%20beginnt%2C%20ausgef%C3%BChrt%3F.png)
Ich habe ein Shell-Skript mit while-Schleife beginnend mit
while [ -n "$1" ]; do
Ich weiß, dass sich das $1
auf das Argument direkt nach dem Namen des Skripts bezieht, also firstargument
wenn ich es ausführe ./myscript.sh firstargument
. Was machen die -n
?
Antwort1
Dies -n
ist 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 shift
Anweisung zum Verschieben des nächsten Positionsparameters enthält $1
und 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 test
Dienstprogramm 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 test
sind 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 test
sowie im Handbuch für Ihre Shell (da es sich um ein integriertes Dienstprogramm handelt).
Dieser -n
Test ist auch einer derStandardPrüfungen und sind daher auch gelistet inder POSIX-Standard für das test
Dienstprogramm.
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.