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