Bash komut dosyasında klavye tarafından girilen n sayılarının toplamı

0

Soru

Öncelikle, "ingilizcem" için özür dilerim.

Klavyeye aktarılan sayıları soran ve bunları ekleyen ve birikmiş tutarı gösteren bir komut dosyası oluşturmalıyım. Ve negatif bir sayı girdiğinizde program sona erecektir.

Çalışan aşağıdaki betiği yaptım, ancak bunu bir akümülatör olarak kullanmak için seq kullanımıyla ikna olmadım, bunu başka bir şekilde yapmak aklıma gelmedi.

Daha fazlasını yapmanın yolları ... Zarif mi ??

Düzenleme: Zarif bir kelime değil, ama yaptığım şey bash'de doğruysa ya da "normatif" ya da "daha az garip"yapmanın bir yolu varsa...

Teşekkürler!

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

Önce aşağıdaki bash işlevini kullanabilirsiniz:

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

İkinci yol, döngüsel olmayan bir varyant yapmaktır:

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

Örnek

Yukarıdakileri bir komut dosyasına koyun, sum.

#!/bin/bash

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

Öyle çalıştır:

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

Üçüncü yol için tavsiye edebilirim :

Bash'a gerek yok, düz sh de yapacak:

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

POSIX kabuklarında$*, $ifs'in ilk karakteriyle (veya $İFS ayarlanmamışsa boşluk veya $İFS boşsa hiçbir şey) ayrılmış konumsal parametreler listesine (bu durumda komut dosyasının bağımsız değişkenleri) genişler. $((...)) kabuk iç aritmetik genişletme işlecidir (ondalık, sekizli ve onaltılık sayıları desteklediğini unutmayın)

Kayan nokta desteğine ihtiyacınız varsa, awk'yi de kullanabilmenize rağmen, ksh93 veya zsh gibi farklı bir kabuğa ihtiyacınız olacak (bash yalnızca tamsayı aritmetiğini desteklediği için bash değil):

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

Bu, sisteminiz tarafından uygulanan uzun (tamsayı için) ve çift (kayan nokta için) tür numaralarını kullanacaktır. Giriş numaraları ondalık kayan nokta veya ingilizce stilinde mühendislik gösterimi olmalıdır (kayan nokta sınırlayıcı, yerel ayardan bağımsız olarak nokta karakteridir). Bazı awk uygulamalarında, awk bunu bir seçenek olarak yorumlamaya çalışacağından ilk sayı negatifse başarısız olur.

POSİXLY_CORRECT ortamdayken GNU awk gibi bazı awk uygulamaları, ikili üs gösterimleri de dahil olmak üzere onaltılık değerleri de destekler. Veya -- ondalık olmayan verilerle sekizli ve onaltılıkları anlar:

$ 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, $num ile $num arasındaki sıralı sayıları gösterir ve burada ne zarif ne de doğrudur.

Bu şekilde yazdım:

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

Her inek gibi kendi bash komut dosyası öğreticim var, bkz. http://linuxintro.org/wiki/BaBE

2021-11-28 12:52:40

Diğer dillerde

Bu sayfa diğer dillerde

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