D'abord, vous pouvez utiliser la fonction bash:
sum() {
local sum=0
for arg in "$@"; do
(( sum += arg ))
done
echo $sum
}
La deuxième façon est de faire un non-bouclage de la variante:
{ printf %d+ "$@"; echo 0; } | bc
Exemple
Mettre le ci-dessus dans un fichier de script, somme.
#!/bin/bash
{ printf %d+ "$@"; echo 0; } | bc
Exécuter de la sorte:
$ ./sum 4
4
$ ./sum 4 4 5
13
Pour la troisième voie que je recommande :
Pas besoin de bash, plaine sh fera ainsi:
#! /bin/sh -
IFS=+; echo "$(($*))"
$* dans POSIX coquilles, s'étend à la liste des paramètres positionnels (dans ce cas, les arguments du script) séparés par le premier caractère de $IFS (ou de l'espace si $IFS n'est pas défini ou rien si $IFS est vide). $((...)) est l'enveloppe interne de l'expansion arithmétique de l'opérateur (à noter qu'il prend en charge décimal, octal et hexadécimal les nombres)
Si vous avez besoin de virgule flottante de soutien, c'est là que vous aurez besoin d'un autre shell comme ksh93 ou zsh (pas bash bash prend uniquement en charge l'arithmétique des nombres entiers), mais vous pouvez également utiliser awk:
#! /usr/bin/awk -f
BEGIN {t=0; for (i in ARGV) t+=ARGV[i]; print t}
Qui va utiliser de long (pour les entiers) et double (pour virgule flottante) type de numéros de tel que mis en œuvre par votre système. Les numéros doivent être décimal à virgule flottante ou en génie de la notation dans le style anglais (floating point séparateur est le caractère de période, indépendamment de la localisation). Avec quelques awk implémentations, il échouera si le premier nombre est négatif, comme awk voudrais essayer de l'interpréter comme une option.
Certains awk implémentations comme GNU awk lors d'environnement posixly_correct est dans l'environnement de soutien hexadécimaux, y compris avec exposant binaire notations. Ou avec --non décimal-data, il comprend octals et caractères hexadécimaux:
$ POSIXLY_CORRECT=1 ./sum 0xap3 0xa
90 # (0xa * 2^3) + 0xa
$ awk --non-decimal-data -f ./sum 010
8