Suma de n números introducidos por teclado en un script de bash

0

Pregunta

En primer lugar, lo siento por "mi inglés".

Tengo que hacer un script que me pide los números pasan a teclado y la adición de ellos y mostrando la cantidad acumulada. Y el programa terminará cuando se introduzca un número negativo.

Me han hecho la siguiente secuencia de comandos que funciona, pero yo no estoy convencido con el uso de la seq en el para utilizarla como un acumulador, no se me ocurrió hacerlo de cualquier otra manera.

Maneras de hacer que sea más Elegante...??

Edit: Elegante no es la palabra, pero si lo que estoy haciendo es correcto en bash o hay una manera de hacerlo "normativo" o "menos extraño"...

Gracias!

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

En primer lugar, puede usar la siguiente función bash:

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

La segunda forma es hacer un no-bucle variante:

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

Ejemplo

Poner lo anterior en un archivo de secuencia de comandos, sum.

#!/bin/bash

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

Ejecutarlo así:

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

Para la tercera forma en la que puedo recomendar :

No hay necesidad de bash, sh va a hacer así:

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

$* en POSIX conchas, se expande la lista de parámetros de posición (en este caso, los argumentos para la secuencia de comandos), separados por el primer carácter de $IFS (o en el espacio, si $IFS no está definida o nada si $IFS está vacía). $((...)) es la cáscara interna, expansión aritmética operador (tenga en cuenta que es compatible con decimal, octal y hexadecimal los números)

Si usted necesita soporte punto flotante, que es donde tendrás un shell diferente como ksh93 o zsh (no bash como bash sólo admite la aritmética de enteros), aunque también podría usar awk:

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

Que se use mucho tiempo (por entero) y doble (de punto flotante) tipo de números, como el implementado por el sistema. La entrada los números deben ser de punto flotante decimal o en notación de ingeniería en el estilo inglés (punto flotante delimitador es el carácter de punto, independientemente de la configuración regional). Con algunos awk implementaciones, se producirá un error si el primer número es negativo como awk podría interpretarlo como una opción.

Algunos awk implementaciones como GNU awk cuando POSIXLY_CORRECT está en el medio ambiente también apoyo hexadecimales incluso con exponente binario notaciones. O con la opción --no-decimal-datos, se entiende octals y hexadecimales:

$ 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

ss $num $num muestra los números secuenciales de $num a $num y no es ni elegante, ni la correcta aquí.

Me gustaría escribir algo como esto:

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

Como cada nerd tengo mis propios scripts de bash tutorial, ver http://linuxintro.org/wiki/BaBE

2021-11-28 12:52:40

En otros idiomas

Esta página está en otros idiomas

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