Primeiro, você pode usar o seguinte bash função:
sum() {
local sum=0
for arg in "$@"; do
(( sum += arg ))
done
echo $sum
}
A segunda maneira é fazer um não-repetição variante:
{ printf %d+ "$@"; echo 0; } | bc
Exemplo
Colocar acima em um arquivo de script, soma.
#!/bin/bash
{ printf %d+ "$@"; echo 0; } | bc
Executa-lo assim:
$ ./sum 4
4
$ ./sum 4 4 5
13
Para a terceira maneira eu posso recomendar :
Nenhuma necessidade para o bash, simples sh vai fazer assim:
#! /bin/sh -
IFS=+; echo "$(($*))"
$* no POSIX conchas, expande-se para a lista de parâmetros posicionais (neste caso, os argumentos para o script) separados pelo primeiro caracter de us $IFS (ou espaço se $IFS é anular ou nada, caso o $IFS está vazia). $((...)) é o shell interno aritméticos operador de expansão (tenha em atenção que suporta decimal, octal e hexadecimal números)
Se você precisa de suporte a ponto flutuante, que é onde você vai precisar de um shell diferente como ksh93 ou zsh (não bash como bash suporta apenas o número inteiro aritmética), embora você também possa usar o awk:
#! /usr/bin/awk -f
BEGIN {t=0; for (i in ARGV) t+=ARGV[i]; print t}
Que irá utilizar (por inteiro) e duplo (para ponto flutuante) tipo de números, como implementado pelo sistema. A entrada de números devem ser decimal de ponto flutuante ou engenharia de notação em estilo inglês (ponto flutuante delimitador é o caractere de ponto, independentemente da localidade). Com alguns awk implementações, ele irá falhar se o primeiro número é negativo, como awk iria tentar interpretá-lo como uma opção.
Alguns awk implementações como o GNU awk quando POSIXLY_CORRECT é no ambiente também suporte hexadecimais inclusive com expoente binário anotações. Ou-não-decimal -, compreende octals e hexadecimais:
$ POSIXLY_CORRECT=1 ./sum 0xap3 0xa
90 # (0xa * 2^3) + 0xa
$ awk --non-decimal-data -f ./sum 010
8