No need for bash
, plain sh
will do as well:
#! /bin/sh -
IFS=+; echo "$(($*))"
$*
in POSIX shells, expands to the list of positional parameters (in this case, the arguments to the script) separated by the first character of $IFS
(or space if $IFS
is unset or nothing if $IFS
is empty). $((...))
is the shell internal arithmetic expansion operator (note that it supports decimal, octal and hexadecimal numbers)
If you need floating point support, that's where you'll need a different shell like ksh93
or zsh
(not bash
as bash
only supports integer arithmetic), though you could also use awk
:
#! /usr/bin/awk -f
BEGIN {t=0; for (i in ARGV) t+=ARGV[i]; print t}
That will use long
(for integer) and double
(for floating point) type numbers as implemented by your system. The input numbers must be decimal floating point or engineering notation in the English style (floating point delimiter is the period character regardless of the locale). With some awk
implementations, it will fail if the first number is negative as awk
would try to interpret it as an option.
Some awk
implementations like GNU awk
when POSIXLY_CORRECT is in the environment also support hexadecimals including with binary exponent notations. Or with --non-decimal-data
, it understands octals and hexadecimals:
$ POSIXLY_CORRECT=1 ./sum 0xap3 0xa
90 # (0xa * 2^3) + 0xa
$ awk --non-decimal-data -f ./sum 010
8
bash
feature won't handle floating point values (eg: 3.5). For that you'd need to use a program such asawk
,python
,dc
,bc
orperl
. See @rici's answer. – NVRAM Nov 05 '13 at 17:12