Soma de n números inseridos pelo teclado em bash script

0

Pergunta

Primeiro, desculpe pelo "meu inglês".

Eu tenho que fazer um script que está me pedindo para números passados para o teclado e adicionando-os e mostrando o valor acumulado. E o programa será encerrado quando você inserir um número negativo.

Eu fiz o seguinte script que funciona, mas eu não estou convencido com o uso de seq para usar isso como um acumulador, não me ocorreu fazê-lo de qualquer outra maneira.

Maneiras de torná-lo mais Elegante...??

Edit: Elegante, não é a palavra, mas se o que eu estou fazendo está correto em bash ou existe uma maneira de fazê-lo "normativo" ou "menos estranho"...

Obrigado!

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

Primeiro, você pode usar o seguinte bash função:

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

A segunda maneira é fazer um não-repetição variante:

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

Exemplo

Colocar acima em um arquivo de script, soma.

#!/bin/bash

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

Executa-lo assim:

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

Para a terceira maneira eu posso recomendar :

Nenhuma necessidade para o bash, simples sh vai fazer assim:

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

$* no POSIX conchas, expande-se para a lista de parâmetros posicionais (neste caso, os argumentos para o script) separados pelo primeiro caracter de us $IFS (ou espaço se $IFS é anular ou nada, caso o $IFS está vazia). $((...)) é o shell interno aritméticos operador de expansão (tenha em atenção que suporta decimal, octal e hexadecimal números)

Se você precisa de suporte a ponto flutuante, que é onde você vai precisar de um shell diferente como ksh93 ou zsh (não bash como bash suporta apenas o número inteiro aritmética), embora você também possa usar o awk:

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

Que irá utilizar (por inteiro) e duplo (para ponto flutuante) tipo de números, como implementado pelo sistema. A entrada de números devem ser decimal de ponto flutuante ou engenharia de notação em estilo inglês (ponto flutuante delimitador é o caractere de ponto, independentemente da localidade). Com alguns awk implementações, ele irá falhar se o primeiro número é negativo, como awk iria tentar interpretá-lo como uma opção.

Alguns awk implementações como o GNU awk quando POSIXLY_CORRECT é no ambiente também suporte hexadecimais inclusive com expoente binário anotações. Ou-não-decimal -, compreende octals e hexadecimais:

$ 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 os números seqüenciais a partir de $num $num, e não é nem elegante, nem correto aqui.

Eu escreveria assim:

#!/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 todo nerd, tenho o meu próprio bash scripting tutorial, veja http://linuxintro.org/wiki/BaBE

2021-11-28 12:52:40

Em outros idiomas

Esta página está em outros idiomas

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