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 ?
Réponses
Trop de publicités?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.
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 detest
. (Voirman [
oman 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$?
a0
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$?
a1
. 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 commandecondition
et, s'il renvoie un code de sortie réussi, il évalue les commandes de la sectionbody
.
Il convient de noter certaines choses que vous pourriez rencontrer :
-
Le site
true
renvoie toujours un code de sortie réussi, etfalse
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 argumentxno 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.