Сначала вы можете использовать следующую функцию bash:
sum() {
local sum=0
for arg in "$@"; do
(( sum += arg ))
done
echo $sum
}
Второй способ-сделать вариант без цикла:
{ printf %d+ "$@"; echo 0; } | bc
Пример
Поместите все вышесказанное в файл сценария, sum.
#!/bin/bash
{ printf %d+ "$@"; echo 0; } | bc
Запустите его так:
$ ./sum 4
4
$ ./sum 4 4 5
13
Для третьего способа я могу порекомендовать :
Нет необходимости в баше, подойдет и обычная рыба:
#! /bin/sh -
IFS=+; echo "$(($*))"
$* в оболочках POSIX расширяется до списка позиционных параметров (в данном случае аргументов скрипта), разделенных первым символом $IFS (или пробелом, если значение $IFS не установлено или ничего, если значение $IFS пусто). $ (( ... ))- оператор расширения внутренней арифметики оболочки (обратите внимание, что он поддерживает десятичные, восьмеричные и шестнадцатеричные числа)
Если вам нужна поддержка с плавающей запятой, вам понадобится другая оболочка, например ksh93 или zsh (не bash, так как bash поддерживает только целочисленную арифметику), хотя вы также можете использовать awk:
#! /usr/bin/awk -f
BEGIN {t=0; for (i in ARGV) t+=ARGV[i]; print t}
Это будет использовать длинные (для целых чисел) и двойные (для чисел с плавающей запятой) числа типа, реализованные вашей системой. Входные числа должны быть десятичными с плавающей запятой или инженерными обозначениями в английском стиле (разделитель с плавающей запятой-символ точки независимо от локали). При некоторых реализациях awk он завершится неудачей, если первое число будет отрицательным, поскольку awk попытается интерпретировать его как вариант.
Некоторые реализации awk, такие как GNU awk, когда POSIXLY_CORRECT находится в среде, также поддерживают шестнадцатеричные числа, в том числе с двоичными обозначениями экспоненты. Или с --не десятичными данными, он понимает окталы и шестнадцатеричные числа:
$ POSIXLY_CORRECT=1 ./sum 0xap3 0xa
90 # (0xa * 2^3) + 0xa
$ awk --non-decimal-data -f ./sum 010
8