¿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?


44
Ese código simplemente almacenaría la cadena literal i+1en la variable isi hay argumentos presentes.
Philipp

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"

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


-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

3
Podría escribirse comoecho "$@" | awk '{print NF}'
user000001

-6

ese valor está contenido en la variable $#


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.