Suma n liczb wprowadzonych z klawiatury w skrypcie bash

0

Pytanie

Po pierwsze, przepraszam za mój angielski".

Muszę stworzyć skrypt, który prosi mnie liczby, przesyłane na klawiaturę, składa je i pokazuje skumulowaną kwotę. I program zakończy się, gdy wpiszesz wartość ujemną.

Zrobiłem następujący skrypt, który działa, ale nie jestem pewien, że z pomocą seq w celu użycia jako baterii mi nie przyszło do głowy zrobić to w inny sposób.

Sposoby, aby to zrobić jeszcze lepiej ... Elegancko ??

Edit: Elegancki-to nie to słowo, ale jeśli to, co robię, jest słuszne w bash, czy istnieje sposób, aby to zrobić "przepisami" lub "mniej dziwne"...

Dziękuję!

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

Po pierwsze można użyć następującej funkcji bash:

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

Drugi sposób-zrobić wariant bez cyklu:

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

Przykład

Umieść wszystkie powyższe w pliku skryptu, sum.

#!/bin/bash

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

Uruchom go tak:

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

Do trzeciego sposobu mogę polecić :

Nie ma potrzeby bache, nadaje się zwykły ryby:

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

$* w powłokach POSIX rozszerza się do listy parametrów pozycyjnych (w tym przypadku argumentów skryptu), podzielonych pierwszym znakiem $IFS (lub spacją, jeśli wartość $IFS nie jest ustawione lub nic, jeśli wartość $IFS pusty). $ (( ... ))- operator rozszerzenie wewnętrznej arytmetyki powłoki (należy pamiętać, że obsługuje dziesiętny, ósemkowy i szesnastkowy liczby)

Jeśli potrzebujesz wsparcia zmiennoprzecinkowych, trzeba będzie inna powłoka, na przykład ksh93 lub zsh (nie bash, tak jak bash obsługuje tylko целочисленную arytmetyki), choć można również użyć awk:

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

To będzie użyć długie (dla liczb całkowitych) i podwójne (dla liczb zmiennoprzecinkowych) liczby typu, realizowane systemem. Liczby wejściowe powinny być miejsc po przecinku liczba zmiennoprzecinkowa lub konsultując się z notacją w stylu angielskim (separator zmiennoprzecinkowych-symbol punktu niezależnie od ustawień regionalnych). W niektórych implementacjach awk jest zakończy się niepowodzeniem, jeśli pierwsza liczba jest ujemny, ponieważ awk próbuje interpretować go jako opcję.

Niektóre implementacje awk, takie jak GNU awk, kiedy mniej ogólne znajduje się w środowisku, także wspierają liczby szesnastkowe, w tym z binarnymi znamionowa wystawcy. Lub-nie danych dziesiętnych, rozumie окталы i liczby szesnastkowe:

$ 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 pokazuje kolejne numery od $num do $num i tutaj nie jest ani elegancki, ani słuszne.

Ja bym to napisał tak:

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

Jak u każdego botanika, mam swój własny poradnik pisania skryptów bash, zob. http://linuxintro.org/wiki/BaBE

2021-11-28 12:52:40

W innych językach

Ta strona jest w innych językach

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