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?


4
Ce code stockera simplement la chaîne littérale i+1dans la variable isi des arguments sont présents.
Philipp

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"

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


-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

3
Pourrait être écrit commeecho "$@" | awk '{print NF}'
user000001

-6

cette valeur est contenue dans la variable $#


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.