En primer lugar, puede usar la siguiente función bash:
sum() {
local sum=0
for arg in "$@"; do
(( sum += arg ))
done
echo $sum
}
La segunda forma es hacer un no-bucle variante:
{ printf %d+ "$@"; echo 0; } | bc
Ejemplo
Poner lo anterior en un archivo de secuencia de comandos, sum.
#!/bin/bash
{ printf %d+ "$@"; echo 0; } | bc
Ejecutarlo así:
$ ./sum 4
4
$ ./sum 4 4 5
13
Para la tercera forma en la que puedo recomendar :
No hay necesidad de bash, sh va a hacer así:
#! /bin/sh -
IFS=+; echo "$(($*))"
$* en POSIX conchas, se expande la lista de parámetros de posición (en este caso, los argumentos para la secuencia de comandos), separados por el primer carácter de $IFS (o en el espacio, si $IFS no está definida o nada si $IFS está vacía). $((...)) es la cáscara interna, expansión aritmética operador (tenga en cuenta que es compatible con decimal, octal y hexadecimal los números)
Si usted necesita soporte punto flotante, que es donde tendrás un shell diferente como ksh93 o zsh (no bash como bash sólo admite la aritmética de enteros), aunque también podría usar awk:
#! /usr/bin/awk -f
BEGIN {t=0; for (i in ARGV) t+=ARGV[i]; print t}
Que se use mucho tiempo (por entero) y doble (de punto flotante) tipo de números, como el implementado por el sistema. La entrada los números deben ser de punto flotante decimal o en notación de ingeniería en el estilo inglés (punto flotante delimitador es el carácter de punto, independientemente de la configuración regional). Con algunos awk implementaciones, se producirá un error si el primer número es negativo como awk podría interpretarlo como una opción.
Algunos awk implementaciones como GNU awk cuando POSIXLY_CORRECT está en el medio ambiente también apoyo hexadecimales incluso con exponente binario notaciones. O con la opción --no-decimal-datos, se entiende octals y hexadecimales:
$ POSIXLY_CORRECT=1 ./sum 0xap3 0xa
90 # (0xa * 2^3) + 0xa
$ awk --non-decimal-data -f ./sum 010
8