Somma di n numeri inseriti da tastiera in bash script

0

Domanda

Prima, ci scusiamo per "il mio inglese".

Devo fare uno script che mi chiede numeri passati della tastiera e l'aggiunta di loro e mostrando l'importo accumulato. E il programma termina quando si immette un numero negativo.

Ho fatto il seguente script che funziona, ma io non sono convinto che con l'uso di seq nell'per utilizzare che come un accumulatore, non si sia verificato a me fare in nessun altro modo.

I modi per renderlo più ... Elegante ??

Edit: Elegante non è la parola, ma se quello che sto facendo è corretto in bash o c'è un modo per farlo "normativo" o "meno strano"...

Grazie!

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

In primo luogo si può usare la seguente funzione bash:

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

Il secondo modo è quello di fare un non-loop variante:

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

Esempio

Metterli in un file di script, somma.

#!/bin/bash

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

Eseguirlo in questo modo:

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

Per il terzo modo posso consigliare :

Nessun bisogno di bash, pianura sh farà così:

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

$* POSIX conchiglie, si espande l'elenco dei parametri posizionali (in questo caso, gli argomenti script) separato dal primo carattere di $IFS (o spazio se $IFS viene annullato o nulla se $IFS è vuoto). $((...)) è la shell interna espansione aritmetica operatore (notare che supporta decimale, ottale e esadecimale numeri)

Se avete bisogno di virgola, che è dove avrete bisogno di una shell diversa come ksh93 o zsh (non bash bash supporta solo l'intero aritmetica), anche se si potrebbe anche usare awk:

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

Che uso a lungo (per intero) e doppio (floating point) tipo di numeri come attuato dal sistema. I numeri inseriti devono essere decimale a virgola mobile o ingegneria notazione in stile inglese (floating point delimitatore è il periodo di caratteri indipendentemente dalle impostazioni internazionali). Con alcuni awk implementazioni, avrà esito negativo se il primo numero è negativo come awk vorresti provare a interpretarla come un'opzione.

Alcuni awk implementazioni come GNU awk quando POSIXLY_CORRECT è nell'ambiente supportano anche le esadecimali anche con esponente binario notazioni. O con --non decimali-i dati, si capisce octals e le esadecimali:

$ 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 mostra la sequenza di numeri da $num per $num e non è né elegante né corretto.

Mi piacerebbe scrivere qualcosa del tipo:

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

Come ogni nerd io ho il mio bash scripting tutorial, vedere http://linuxintro.org/wiki/BaBE

2021-11-28 12:52:40

In altre lingue

Questa pagina è in altre lingue

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