První, můžete použít následující bash funkce:
sum() {
local sum=0
for arg in "$@"; do
(( sum += arg ))
done
echo $sum
}
Druhý způsob je udělat non-opakování varianta:
{ printf %d+ "$@"; echo 0; } | bc
Příklad
Dal výše, v souboru skriptu, součet.
#!/bin/bash
{ printf %d+ "$@"; echo 0; } | bc
Spustit jako tak:
$ ./sum 4
4
$ ./sum 4 4 5
13
Pro třetí způsob, jak mohu doporučit :
Není třeba pro bash, prostý sh bude dělat stejně:
#! /bin/sh -
IFS=+; echo "$(($*))"
$* v POSIX skořápky, rozšiřuje se seznam poziční parametry (v tomto případě, argumenty skriptu) odděleny prvním znakem z $IFS (nebo prostor, pokud $IFS je odstavení nebo nic, pokud $IFS je prázdný). $((...)) je shell vnitřní aritmetické expanzi operátora (všimněte si, že to podporuje desítkové, osmičkové a hexadecimální čísla)
Pokud potřebujete s plovoucí desetinnou podporu, to je místo, kde budete potřebovat jiný shell jako ksh93 nebo zsh (ne bash jako bash podporuje pouze celočíselné aritmetiky), ale můžete také použít awk:
#! /usr/bin/awk -f
BEGIN {t=0; for (i in ARGV) t+=ARGV[i]; print t}
Že bude používat dlouho (pro celé číslo) a double (pro plovoucí bod), typ čísla, tak jak je uplatňován systém. Vstupní čísla musí být desetinné číslo s plovoucí desetinnou nebo inženýrské notace v anglickém stylu (s plovoucí desetinnou oddělovač je znak tečka bez ohledu na národní prostředí). S některými awk implementace, to se nezdaří, pokud první číslo je negativní awk, jako by se snažil interpretovat to jako možnost.
Některé implementace awk, jako GNU awk když POSIXLY_CORRECT je v prostředí také podpora šestnáctkové soustavě, včetně s binární exponent zápisy. Nebo --non-desítkové-data, chápe octals a šestnáctkové soustavě:
$ POSIXLY_CORRECT=1 ./sum 0xap3 0xa
90 # (0xa * 2^3) + 0xa
$ awk --non-decimal-data -f ./sum 010
8