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