În primul rând, puteți utiliza următoarele bash funcția:
sum() {
local sum=0
for arg in "$@"; do
(( sum += arg ))
done
echo $sum
}
A doua modalitate este de a face un non-looping varianta:
{ printf %d+ "$@"; echo 0; } | bc
Exemplu
A pus mai sus într-un fișier script, suma.
#!/bin/bash
{ printf %d+ "$@"; echo 0; } | bc
Rulați astfel:
$ ./sum 4
4
$ ./sum 4 4 5
13
Pentru cel de-al treilea mod în care pot recomanda :
Nu este nevoie pentru bash, pur sh va face la fel de bine:
#! /bin/sh -
IFS=+; echo "$(($*))"
$* în POSIX scoici, se extinde la lista de parametrii de poziție (în acest caz, argumentele pentru a script-ul) separate de primul caracter al $IFS (sau spațiu, dacă $IFS este dezactivat sau nimic dacă $IFS este gol). $((...)) este învelișul intern aritmetică expansiune operator (rețineți că se acceptă zecimal, octal și numere hexazecimale)
Dacă aveți nevoie plutitoare punct de sprijin, care este în cazul în care veți avea nevoie de o coajă diferite ca ksh93 sau zsh (nu bash bash acceptă numai aritmetică întreg), deși ai putea folosi, de asemenea, awk:
#! /usr/bin/awk -f
BEGIN {t=0; for (i in ARGV) t+=ARGV[i]; print t}
Care va folosi timp (pentru întreg) și dublu (pentru virgulă mobilă) de tip numere cum sunt puse în aplicare de către sistem. La numerele de intrare trebuie să fie zecimal în virgulă mobilă sau inginerie notație în stil englezesc (floating point delimitator este perioada de caracter indiferent de localizare). Cu unele awk implementări, acesta va eșua în cazul în care primul număr este negativ ca awk ar încerca să-l interpreteze ca o opțiune.
Unele awk implementari ca GNU awk când POSIXLY_CORRECT este în mediu, de asemenea, sprijin hexadecimals inclusiv cu binare exponent notații. Sau cu ... non-zecimal-date, se înțelege octals și hexadecimals:
$ POSIXLY_CORRECT=1 ./sum 0xap3 0xa
90 # (0xa * 2^3) + 0xa
$ awk --non-decimal-data -f ./sum 010
8