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.