Součet n čísel zapsaných pomocí klávesnice v bash skriptu

0

Otázka

Za prvé, omlouvám se za "moje angličtina".

Mám udělat skript, který se mě ptá na čísla přešel na klávesnici a přidávat je a ukazuje, nahromaděné množství. A program bude konec, když zadáte záporné číslo.

Udělal jsem následující skript, který funguje, ale nejsem přesvědčen o tom, s použitím následujících v pro použití jako akumulátor, to není mě nenapadlo dělat to jinak.

Způsoby, jak dělat to více Elegantní ??

Edit: Elegantní není slovo, ale jestli to, co dělám, je správné v bash nebo tam je způsob, jak to udělat "normativní" nebo "divně"...

Díky!!!

#!/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

První, můžete použít následující bash funkce:

sum() {
    local sum=0
    for arg in "$@"; do
        (( sum += arg ))
    done   
    echo $sum
}

Druhý způsob je udělat non-opakování varianta:

{ printf %d+ "$@"; echo 0; } | bc

Příklad

Dal výše, v souboru skriptu, součet.

#!/bin/bash

{ printf %d+ "$@"; echo 0; } | bc

Spustit jako tak:

$ ./sum 4
4
$ ./sum 4 4 5
13

Pro třetí způsob, jak mohu doporučit :

Není třeba pro bash, prostý sh bude dělat stejně:

#! /bin/sh - 
IFS=+; echo "$(($*))"

$* v POSIX skořápky, rozšiřuje se seznam poziční parametry (v tomto případě, argumenty skriptu) odděleny prvním znakem z $IFS (nebo prostor, pokud $IFS je odstavení nebo nic, pokud $IFS je prázdný). $((...)) je shell vnitřní aritmetické expanzi operátora (všimněte si, že to podporuje desítkové, osmičkové a hexadecimální čísla)

Pokud potřebujete s plovoucí desetinnou podporu, to je místo, kde budete potřebovat jiný shell jako ksh93 nebo zsh (ne bash jako bash podporuje pouze celočíselné aritmetiky), ale můžete také použít awk:

#! /usr/bin/awk -f
BEGIN {t=0; for (i in ARGV) t+=ARGV[i]; print t}

Že bude používat dlouho (pro celé číslo) a double (pro plovoucí bod), typ čísla, tak jak je uplatňován systém. Vstupní čísla musí být desetinné číslo s plovoucí desetinnou nebo inženýrské notace v anglickém stylu (s plovoucí desetinnou oddělovač je znak tečka bez ohledu na národní prostředí). S některými awk implementace, to se nezdaří, pokud první číslo je negativní awk, jako by se snažil interpretovat to jako možnost.

Některé implementace awk, jako GNU awk když POSIXLY_CORRECT je v prostředí také podpora šestnáctkové soustavě, včetně s binární exponent zápisy. Nebo --non-desítkové-data, chápe octals a šestnáctkové soustavě:

$ 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 ukazuje sekvenční čísla od $num $num a není ani elegantní, ani správné.

Já bych to napsat takhle:

#!/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

Jako každý blbeček mám vlastní bash scripting tutorial, viz http://linuxintro.org/wiki/BaBE

2021-11-28 12:52:40

V jiných jazycích

Tato stránka je v jiných jazycích

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