Сумма n чисел, введенных с клавиатуры в скрипте bash

0

Вопрос

Во-первых, извините за "мой английский".

Я должен создать скрипт, который запрашивает у меня числа, передаваемые на клавиатуру, складывает их и показывает накопленную сумму. И программа завершится, когда вы введете отрицательное число.

Я сделал следующий сценарий, который работает, но я не уверен, что с использованием seq в для использования этого в качестве аккумулятора мне не пришло в голову сделать это каким-либо другим способом.

Способы сделать это еще лучше ... Элегантно ??

Редактировать: Элегантный-это не то слово, но если то, что я делаю, правильно в bash или есть способ сделать это "нормативным" или "менее странным"...

Спасибо!

#!/bin/bash
#accumulated sum of numbers


i=0
sum=0
while [[ true ]]; do

echo "Insert a number: "
read num

if (($num < 0)); then
echo "Negative number, exit..."
break
fi

for i in $(seq $num $num); do
sum=$(($i + $sum))
done
echo "The sum of the previous numbers is $sum"

done 
bash linux script sum
2021-11-23 23:48:45
2
0

Сначала вы можете использовать следующую функцию 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
2021-11-24 09:05:41
0

seq $num $num показывает последовательные числа от $num до $num и здесь не является ни элегантным, ни правильным.

Я бы написал это так:

#!/bin/bash
#accumulated sum of numbers

i=0
sum=0
while [[ true ]]; do

echo "Insert a number: "
read num

if (($num < 0)); then
echo "Negative number, exit..."
echo "The sum of the previous numbers is $sum"
break
else ((sum+=$num))
fi
done

Как у каждого ботаника, у меня есть свой собственный учебник по написанию сценариев bash, см. http://linuxintro.org/wiki/BaBE

2021-11-28 12:52:40

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................