Po pierwsze można użyć następującej funkcji bash:
sum() {
local sum=0
for arg in "$@"; do
(( sum += arg ))
done
echo $sum
}
Drugi sposób-zrobić wariant bez cyklu:
{ printf %d+ "$@"; echo 0; } | bc
Przykład
Umieść wszystkie powyższe w pliku skryptu, sum.
#!/bin/bash
{ printf %d+ "$@"; echo 0; } | bc
Uruchom go tak:
$ ./sum 4
4
$ ./sum 4 4 5
13
Do trzeciego sposobu mogę polecić :
Nie ma potrzeby bache, nadaje się zwykły ryby:
#! /bin/sh -
IFS=+; echo "$(($*))"
$* w powłokach POSIX rozszerza się do listy parametrów pozycyjnych (w tym przypadku argumentów skryptu), podzielonych pierwszym znakiem $IFS (lub spacją, jeśli wartość $IFS nie jest ustawione lub nic, jeśli wartość $IFS pusty). $ (( ... ))- operator rozszerzenie wewnętrznej arytmetyki powłoki (należy pamiętać, że obsługuje dziesiętny, ósemkowy i szesnastkowy liczby)
Jeśli potrzebujesz wsparcia zmiennoprzecinkowych, trzeba będzie inna powłoka, na przykład ksh93 lub zsh (nie bash, tak jak bash obsługuje tylko целочисленную arytmetyki), choć można również użyć awk:
#! /usr/bin/awk -f
BEGIN {t=0; for (i in ARGV) t+=ARGV[i]; print t}
To będzie użyć długie (dla liczb całkowitych) i podwójne (dla liczb zmiennoprzecinkowych) liczby typu, realizowane systemem. Liczby wejściowe powinny być miejsc po przecinku liczba zmiennoprzecinkowa lub konsultując się z notacją w stylu angielskim (separator zmiennoprzecinkowych-symbol punktu niezależnie od ustawień regionalnych). W niektórych implementacjach awk jest zakończy się niepowodzeniem, jeśli pierwsza liczba jest ujemny, ponieważ awk próbuje interpretować go jako opcję.
Niektóre implementacje awk, takie jak GNU awk, kiedy mniej ogólne znajduje się w środowisku, także wspierają liczby szesnastkowe, w tym z binarnymi znamionowa wystawcy. Lub-nie danych dziesiętnych, rozumie окталы i liczby szesnastkowe:
$ POSIXLY_CORRECT=1 ./sum 0xap3 0xa
90 # (0xa * 2^3) + 0xa
$ awk --non-decimal-data -f ./sum 010
8