En la siguiente función con 9 argumentos:
SUM() {
echo "The sum is $(($1+$2+$3+$4+$5+$6+$7+$8+$9))"
}
Quiero hacer que los segundos argumentos para el siguiente (3..9) se conviertan en argumentos opcionales .
Cuando llamo a la función con 2 argumentos me sale un error:
SUM 3 8
bash: 3+8+++++++: syntax error: operand expected (error token is "+")
Nota BOLD : el primer argumento y el segundo argumento son argumentos de fuerza y no son opcionales para la función. Solo quiero que los segundos argumentos para el siguiente sean opcionales y cuando llamo a la función menos de 2 args, la función no debe devolver ningún resultado.
Echa un vistazo al
shift
operador. Desplazará los argumentos 2 y hacia adelante a las posiciones 1 y hacia adelante, descartando el argumento 1.fuente
Podría usar una definición recursiva que termina cuando
sum
se invoca sin argumentos. Hacemos uso del hecho de quetest
sin argumentos se evalúafalse
.fuente
Prueba esto:
Esto generará 12 y 30.
$@
se refiere al parámetro,$#
devuelve el número de parámetro, en este caso 3 u 11.Probado en Linux Redhat 4
fuente
Podrías usar un pequeño bucle:
Personalmente, solo usaría
perl
o en suawk
lugar:o
fuente
Use 0 como valores predeterminados de $ 1 a $ 9:
De
man bash
:Ejemplos:
La suma es 0
La suma es 3
La suma es 9
Misma salida con awk:
fuente
También es mi propia solución. Lo probé y encontré:
Pero la respuesta de @ muru es buena.
fuente