Não há necessidade de bash , simples sh também:
#! /bin/sh -
IFS=+; echo "$(($*))"
$* em shells POSIX, expande para a lista de parâmetros posicionais (nesse caso, os argumentos para o script) separados pelo primeiro caractere de $IFS (ou espaço se $IFS não estiver definido ou nada se $IFS está vazio). $((...)) é o operador de expansão aritmética interna do shell (observe que ele suporta números decimais, octais e hexadecimais)
Se você precisar de suporte a ponto flutuante, é necessário um shell diferente, como ksh93 ou zsh (não bash como bash suporta apenas a aritmética de inteiros), embora você também possa usar awk :
#! /usr/bin/awk -f
BEGIN {t=0; for (i in ARGV) t+=ARGV[i]; print t}
Isso usará os números de tipo double implementados pelo seu sistema. Os números de entrada devem ser ponto flutuante decimal ou notação de engenharia no estilo inglês (o delimitador de ponto flutuante é o caractere período , independentemente da localidade).
Alguns acham implementações como GNU awk quando POSIXLY_CORRECT está no ambiente também suportam hexadecimais incluindo com notações de expoentes binários. Ou com --non-decimal-data , entende octais e hexadecimais:
$ POSIXLY_CORRECT=1 ./sum 0xap3 0xa
90 # (0xa * 2^3) + 0xa
$ awk --non-decimal-data -f ./sum 010
8