Önce aşağıdaki bash işlevini kullanabilirsiniz:
sum() {
local sum=0
for arg in "$@"; do
(( sum += arg ))
done
echo $sum
}
İkinci yol, döngüsel olmayan bir varyant yapmaktır:
{ printf %d+ "$@"; echo 0; } | bc
Örnek
Yukarıdakileri bir komut dosyasına koyun, sum.
#!/bin/bash
{ printf %d+ "$@"; echo 0; } | bc
Öyle çalıştır:
$ ./sum 4
4
$ ./sum 4 4 5
13
Üçüncü yol için tavsiye edebilirim :
Bash'a gerek yok, düz sh de yapacak:
#! /bin/sh -
IFS=+; echo "$(($*))"
POSIX kabuklarında$*, $ifs'in ilk karakteriyle (veya $İFS ayarlanmamışsa boşluk veya $İFS boşsa hiçbir şey) ayrılmış konumsal parametreler listesine (bu durumda komut dosyasının bağımsız değişkenleri) genişler. $((...)) kabuk iç aritmetik genişletme işlecidir (ondalık, sekizli ve onaltılık sayıları desteklediğini unutmayın)
Kayan nokta desteğine ihtiyacınız varsa, awk'yi de kullanabilmenize rağmen, ksh93 veya zsh gibi farklı bir kabuğa ihtiyacınız olacak (bash yalnızca tamsayı aritmetiğini desteklediği için bash değil):
#! /usr/bin/awk -f
BEGIN {t=0; for (i in ARGV) t+=ARGV[i]; print t}
Bu, sisteminiz tarafından uygulanan uzun (tamsayı için) ve çift (kayan nokta için) tür numaralarını kullanacaktır. Giriş numaraları ondalık kayan nokta veya ingilizce stilinde mühendislik gösterimi olmalıdır (kayan nokta sınırlayıcı, yerel ayardan bağımsız olarak nokta karakteridir). Bazı awk uygulamalarında, awk bunu bir seçenek olarak yorumlamaya çalışacağından ilk sayı negatifse başarısız olur.
POSİXLY_CORRECT ortamdayken GNU awk gibi bazı awk uygulamaları, ikili üs gösterimleri de dahil olmak üzere onaltılık değerleri de destekler. Veya -- ondalık olmayan verilerle sekizli ve onaltılıkları anlar:
$ POSIXLY_CORRECT=1 ./sum 0xap3 0xa
90 # (0xa * 2^3) + 0xa
$ awk --non-decimal-data -f ./sum 010
8