¿Cómo encuentro el número de argumentos pasados ​​a un script Bash?

182

¿Cómo encuentro el número de argumentos pasados ​​a un script Bash?

Esto es lo que tengo actualmente:

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

¿Hay otras (mejores) formas de hacer esto?

sabri
fuente
44
Ese código simplemente almacenaría la cadena literal i+1en la variable isi hay argumentos presentes.
Philipp
relacionado: stackoverflow.com/questions/18568706/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

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"
Pausado hasta nuevo aviso.
fuente
También me ayudó, lo que estaba tratando de hacer es; #! / bin / bash count = 0 sum = 0 avg = 0 para var en "$ @" do ((sum + = $ var)) ((count ++)) done ((avg = sum / $ count)) echo " la suma de los números es: $ sum "echo" el promedio de los números es: $ avg "que me ayuda a obtener números desconocidos de args y hacer algunos cálculos (puede editar el operando) Gracias por Dennis Williamson, lo hice. Estoy publicando en el código porque puede ser útil para alguien.
kaan yılmaz
1
@ kaanyılmaz: El único problema con eso es que Bash solo hace aritmética de enteros. Si desea decimales, deberá usar AWK, bco alguna otra cosa (ksh93 y zsh también pueden hacer cálculos decimales). Su código incluye signos de dólar para algunas variables, pero no para otras. Debe ser coherente con su uso o no. Por dentro (())no son necesarios. Sin embargo, están en las echodeclaraciones.
Pausado hasta nuevo aviso.
No soy muy bueno con Linux, acabo de modificar su código como lo necesitaba. Es su código básicamente
kaan yılmaz
Gracias por el código, es muy bueno.
Smeterlink
12

para agregar la referencia original:

Puede obtener el número de argumentos del parámetro especial $#. El valor de 0 significa "sin argumentos". $#es de solo lectura.

Cuando se usa junto con el shiftprocesamiento de argumentos, el parámetro especial $#se reduce cada vez que shiftse ejecuta Bash Builtin .

vea el Manual de referencia de Bash en la sección 3.4.2 Parámetros especiales :

  • "El shell trata varios parámetros especialmente. Estos parámetros solo pueden ser referenciados "

  • y en esta sección para la palabra clave $ # "Se expande al número de parámetros posicionales en decimal".

Michael Brux
fuente
-1

A continuación se muestra el fácil:

gato countvariable.sh

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

Salida:

#./countvariable.sh 1 2 3 4 5 6
6
#./countvariable.sh 1 2 3 4 5 6 apple orange
8
VIPIN KUMAR
fuente
3
Podría escribirse comoecho "$@" | awk '{print NF}'
user000001
-6

ese valor está contenido en la variable $#

Jeff Gaer
fuente
44
Aparte del hecho de que hay casi la misma respuesta (pero correcta) que tiene 4 años, su respuesta es incorrecta, debería serlo$#
Nachteil