Com awk
, supondo que a soma e cada argumento de número individual possam caber no tipo long
do seu sistema e considerando apenas sequências de dígitos decimais com um sinal -
inicial opcional:
#! /bin/sh -
awk 'BEGIN{
sum = 0
for (i = 1; i < ARGC; i++)
if (ARGV[i] ~ /^-?[0123456789]+$/)
sum += ARGV[i]
print sum}' "$@"
Para precisão arbitrária, você pode usar bc
:
#! /bin/sh -
awk 'BEGIN{
for (i = 1; i < ARGC; i++)
if (ARGV[i] ~ /^-?[0123456789]+$/)
print "s+="ARGV[i]
print "s"}' "$@" | bc
Exemplo:
$ ./sum1 999999999999999999999999 1
999999999999999983222784
$ ./sum2 999999999999999999999999 1
1000000000000000000000000