Comment trouver le nombre d'arguments transmis à un script Bash?

182

Comment trouver le nombre d'arguments transmis à un script Bash?

Voici ce que j'ai actuellement:

#!/bin/bash
i=0
for var in "$@"
do
  i=i+1
done

Y a-t-il d'autres (meilleures) façons de faire cela?

sabri
la source
4
Ce code stockera simplement la chaîne littérale i+1dans la variable isi des arguments sont présents.
Philipp
en relation: stackoverflow.com/questions/18568706/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

99
#!/bin/bash
echo "The number of arguments is: $#"
a=${@}
echo "The total length of all arguments is: ${#a}: "
count=0
for var in "$@"
do
    echo "The length of argument '$var' is: ${#var}"
    (( count++ ))
    (( accum += ${#var} ))
done
echo "The counted number of arguments is: $count"
echo "The accumulated length of all arguments is: $accum"
Suspendu jusqu'à nouvel ordre.
la source
Cela m'a aidé aussi, ce que j'essayais de faire est; #! / bin / bash count = 0 sum = 0 avg = 0 for var in "$ @" do ((sum + = $ var)) ((count ++)) done ((avg = sum / $ count)) echo " la somme des nombres est: $ sum "echo" la moyenne des nombres est: $ avg "ce qui m'aide à obtenir des nombres inconnus d'arguments et à faire des maths (vous pouvez éditer l'opérande) Merci pour Dennis Williamson, je l'ai fait. Je poste sur du code parce que cela peut être utile pour quelqu'un.
kaan yılmaz
1
@ kaanyılmaz: Le seul problème avec cela est que Bash ne fait que l'arithmétique entière. Si vous voulez des décimales, vous devrez utiliser AWK, bcou autre chose (ksh93 et ​​zsh peuvent également faire des calculs décimaux). Votre code inclut des signes dollar pour certaines variables, mais pas pour d'autres. Vous devez être cohérent sur leur utilisation ou non. À l'intérieur, (())ils ne sont pas nécessaires. Ils sont, cependant, dans les echodéclarations.
Suspendu jusqu'à nouvel ordre.
Je ne suis pas très bon avec Linux, je viens de modifier votre code selon mes besoins. C'est essentiellement votre code
kaan yılmaz
Merci pour le code, c'est très bien.
Smeterlink
12

pour ajouter la référence d'origine:

Vous pouvez obtenir le nombre d'arguments à partir du paramètre spécial $#. La valeur 0 signifie "aucun argument". $#est en lecture seule.

Lorsqu'il est utilisé avec shiftpour le traitement des arguments, le paramètre spécial $#est décrémenté chaque fois que Bash Builtin shiftest exécuté.

voir le manuel de référence de Bash dans la section 3.4.2 Paramètres spéciaux :

  • "Le shell traite plusieurs paramètres spécialement. Ces paramètres ne peuvent être référencés "

  • et dans cette section pour le mot-clé $ # "S'étend au nombre de paramètres de position en décimal."

Michael Brux
la source
-1

Ci-dessous est le plus facile -

chat countvariable.sh

echo "$@" |awk '{for(i=0;i<=NF;i++); print i-1 }'

Production :

#./countvariable.sh 1 2 3 4 5 6
6
#./countvariable.sh 1 2 3 4 5 6 apple orange
8
VIPIN KUMAR
la source
3
Pourrait être écrit commeecho "$@" | awk '{print NF}'
user000001
-6

cette valeur est contenue dans la variable $#

Jeff Gaer
la source
4
Mis à part le fait qu'il y a presque exactement la même réponse (mais correcte) qui date de 4 ans, votre réponse est fausse - ça devrait être$#
nachteil