Somme de n nombres entrés au clavier dans le script bash

0

La question

Tout d'abord, désolé pour le "mon anglais".

Je dois faire un script qui me demande de numéros passé à clavier et à les ajouter et indiquant le montant accumulé. Et le programme prendra fin lorsque vous entrez un nombre négatif.

J'ai fait le script suivant qui fonctionne, mais je ne suis pas convaincu par l'utilisation de seq dans le pour l'utiliser comme un accumulateur, il n'a pas eu lieu pour moi de le faire d'une autre façon.

Façons de le rendre plus Élégant...??

Edit: Élégant n'est pas le mot, mais si ce que je fais est correct en bash ou il y a un moyen de le faire "normatif" ou "moins étrange"...

Merci!

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

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
2021-11-24 09:05:41
0

seq $num $num montre les numéros séquentiels à partir de $num de $num et n'est ni élégant, ni de corriger ici.

Je préfère l'écrire comme ceci:

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

Comme chaque ballot, j'ai mes propres scripts bash tutoriel, voir http://linuxintro.org/wiki/BaBE

2021-11-28 12:52:40

Dans d'autres langues

Cette page est dans d'autres langues

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