Ich bin neu bei Unix/Linux. Ich versuche, den Code des Entwicklers vor mir zu verstehen. Kann mir bitte jemand sagen, was diese Zeile bedeutet if [ $# -lt 2 ]
?
Antwort1
In Bash $#
wird die Anzahl der festgelegten Positionsparameter erweitert.
if [ $a -lt $b ]
bedeutet, wenn der Wert von a kleiner ist als der Wert von b.
if [ $# -lt 2 ]
bedeutet, dass die Anzahl der festgelegten Positionsparameter kleiner als 2 ist.
In einem funktionierenden Beispiel würden Sie dies vielleicht verwenden, um die einer Funktion übergebenen Parameter zu zählen. Wenn Sie eine Funktion wie folgt definieren:
count_words(){
if [ $# -lt 2 ]
then
echo "There are less than two words."
else
echo "There are 2 or more words."
fi
}
Rufen Sie die Funktion dann mit unterschiedlichen Wortzahlen auf, die Ergebnisse wären wie folgt:
$ count_words hello
There are less than two words.
$ count_words how many words
There are two or more words.
$ count_words
There are less than two words.
$ count_words two words
There are two or more words.
Antwort2
Dies ist eine Kombination aus drei Dingen:
$#
ist eine Shell-Variable, die die Anzahl der Positionsargumente für ein Skript oder eine Funktion enthält.[
ist keine spezielle Syntax, sondern der Name eines Programms – es ist ein Alias fürtest
. (Sieheman [
oderman test
.)Die Befehlszeile von
[
wird als Ausdruck analysiert: wird mit den Argumenten , , , und (was nur ein visuelles Trennzeichen ist)[ $# -lt 2 ]
aufgerufen . Es wird ein erfolgreicher Exit-Code zurückgegeben, der auf gesetzt wird, wenn der Ausdruck als wahr ausgewertet wird (d. h. wenn die Anzahl der Argumente des Skripts kleiner als 2 ist), andernfalls ein fehlgeschlagener Exit-Code, der auf gesetzt wird . Sie können dies sehen, indem Sie Folgendes eingeben:[
$#
-lt
2
]
$?
0
$?
1
[ 1 -lt 2 ]; echo $? # 1 < 2 is true: 0 [ 2 -lt 1 ]; echo $? # 2 < 1 is false: 1
if condition; then body; fi
wertet den Befehl auscondition
und fährt, wenn ein erfolgreicher Exit-Code zurückgegeben wird, mit der Auswertung der Befehle in fortbody
.
Beachten Sie einige Dinge, auf die Sie stoßen könnten:
Das
true
Dienstprogramm gibt immer einen erfolgreichen Exit-Code undfalse
immer einen Fehler zurück, sodass Sie sie unter bestimmten Bedingungen verwenden können, z. B.:while true; do … done
if [ $foo = "yes" ]
funktioniert nicht, wenn$foo
es zu einem leeren String ([ = yes ]
) oder einem String mit Leerzeichen ([ no thanks = yes ]
) erweitert wird. Daher werden Sie häufig Folgendes sehen:if [ "x$foo" = "xyes" ]
Das
[
erhält also ein einzelnes Argumentxno thanks
als ersten Operand von=
.[[
…]]
ist eine MuschelStichwort(keineingebaut), mit speziellen Analyseregeln, um die oben genannte Einschränkung zu beheben und die möglicherweise zusätzliche Funktionen bieten.