Was bedeutet if [ $# -lt 2 ]?

Was bedeutet if [ $# -lt 2 ]?

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ür test. (Siehe man [oder man 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:[$#-lt2]$?0$?1

    [ 1 -lt 2 ]; echo $?    # 1 < 2 is true: 0
    [ 2 -lt 1 ]; echo $?    # 2 < 1 is false: 1
    
  • if condition; then body; fiwertet den Befehl aus conditionund fährt, wenn ein erfolgreicher Exit-Code zurückgegeben wird, mit der Auswertung der Befehle in fort body.

Beachten Sie einige Dinge, auf die Sie stoßen könnten:

  • Das trueDienstprogramm gibt immer einen erfolgreichen Exit-Code und falseimmer 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 $fooes 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 Argument xno thanksals 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.

verwandte Informationen