7 votes

Que signifie si [ $# -lt 2 ] ?

Je suis nouveau sur Unix/Linux. J'essaie de comprendre le code du développeur qui m'a précédé. Quelqu'un peut-il me dire ce que fait cette ligne if [ $# -lt 2 ] C'est-à-dire ?

15voto

Arronical Points 18815

Dans Bash $# s'étend au nombre de paramètres positionnels qui ont été définis.

if [ $a -lt $b ] signifie que si la valeur de a est inférieure à la valeur de b.

if [ $# -lt 2 ] signifie que le nombre de paramètres positionnels définis est inférieur à 2.

Dans un exemple de travail, vous pourriez l'utiliser pour compter les paramètres donnés à une fonction. Si vous définissez une fonction comme :

count_words(){
  if [ $# -lt 2 ]
  then
    echo "There are less than two words."
  else
    echo "There are 2 or more words."
  fi
}

Appelez ensuite la fonction avec des nombres de mots différents, les résultats seraient les suivants :

$ 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.

3voto

mattbasta Points 631

C'est une composition de trois choses :

  • $# est une variable Shell qui contient le nombre d'arguments positionnels à un Shell ou une fonction.

  • [ n'est pas une syntaxe spéciale, mais plutôt le nom d'un programme - c'est un alias de test . (Voir man [ o man test .)

    La ligne de commande de [ est analysé comme une expression : [ $# -lt 2 ] appelle [ avec les arguments $# , -lt , 2 y ] (qui n'est qu'un délimiteur visuel). Elle renvoie un code de sortie réussi, en mettant $? a 0 si l'expression est évaluée à true (c'est-à-dire si le nombre d'arguments du script est inférieur à 2) ou un code de sortie d'échec dans le cas contraire, la définition de $? a 1 . Vous pouvez le voir en entrant :

    [ 1 -lt 2 ]; echo $?    # 1 < 2 is true: 0
    [ 2 -lt 1 ]; echo $?    # 2 < 1 is false: 1
  • if condition; then body; fi évalue la commande condition et, s'il renvoie un code de sortie réussi, il évalue les commandes de la section body .

Il convient de noter certaines choses que vous pourriez rencontrer :

  • Le site true renvoie toujours un code de sortie réussi, et false renvoie toujours un échec, vous pouvez donc les utiliser dans des conditions, par exemple :

    while true; do
      …
    done
  • if [ $foo = "yes" ] ne fonctionnera pas si $foo se développe jusqu'à la chaîne vide ( [ = yes ] ), ou à une chaîne de caractères contenant des espaces ( [ no thanks = yes ] ). C'est pourquoi vous verrez souvent :

    if [ "x$foo" = "xyes" ]

    Alors que [ reçoit un seul argument xno thanks comme premier opérande de = .

  • [[ ]] est un Shell mot-clé (pas un intégré ), avec des règles d'analyse spéciales pour résoudre la limitation ci-dessus, et qui peuvent fournir des fonctionnalités supplémentaires.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X