Súčet n zadaných čísel pomocou klávesnice v bash skript

0

Otázka

Po prvé, ospravedlňujeme sa za "moja angličtina".

Musím urobiť skript, ktorý sa odo mňa vyžaduje čísla prenesené do klávesnice a pridávať im nahor a zobrazuje akumulovaná hodnota. A program skončí, keď zadať záporné číslo.

Urobil som nasledujúci skript, ktorý funguje, ale nie som presvedčený, s použitím nasl v pre použitie že ako akumulátor, nebolo napadlo ma na to iný spôsob.

Spôsoby, ako robiť to viac ... Elegantné ??

Edit: Elegantné, nie je slovo, ale či to, čo robím, je správne v bash alebo existuje spôsob, ako to urobiť, "normatívna" alebo "menej podivné"...

Vďaka!

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

Najprv môžete použiť tieto bash funkcia:

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

Druhý spôsob je urobiť non-opakovanie variant:

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

Príklad

Dať vyššie v skript file, súčet.

#!/bin/bash

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

Spustite ho ako tak:

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

Pre tretí spôsob, ako môžem odporučiť :

Nie je potrebné pre bash, obyčajný sh bude robiť aj:

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

$* v POSIX kotlov, rozširuje do zoznamu pozičné parametre (v tomto prípade argumenty skriptu) oddelené prvý znak $IFS (alebo priestor, ak $IFS je nastavená alebo nič, ak $IFS je prázdny). $((...)) je shell vnútorný priemer rozšírenie operátora (všimnite si, že to podporuje desatinné, octal a šestnástkové čísla)

Ak potrebujete plávajúce bod podpora, to je miesto, kde budete potrebovať rôzne shell, ako ksh93 alebo zsh (nie bash ako bash podporuje len celočíselnú aritmetiku), aj keď by ste mohli použiť aj ispell:

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

Že bude používať dlho (na celé číslo) a dvojlôžkové (pre pohyblivou rádovou čiarkou) typ čísla, tak ako je implementovaná váš systém. Vstupné čísla musia byť desatinné s pohyblivou rádovou čiarkou alebo inžinierske zápisu v anglickom štýle (s pohyblivou rádovou čiarkou oddeľovač je obdobie znakov bez ohľadu na to, locale). S niektorými ispell implementácií, to sa nepodarí, ak prvé číslo je záporné, ako ispell by sa snažiť interpretovať ako možnosť.

Niektoré ispell implementácií, ako GNU ispell, keď POSIXLY_CORRECT je v prostredí podporu aj hexadecimálne vrátane s binárnych exponent záznamy. Alebo s --non-desatinné-údaje, chápe octals a hexadecimálne:

$ 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

ďalšie $num $num zobrazuje poradové čísla od $num na $num a nie je ani elegantné ani tu správne.

Ja by som napíšte to takto:

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

Ako každý hlupák mám svoj vlastný bash skriptovanie tutorial, pozrite si http://linuxintro.org/wiki/BaBE

2021-11-28 12:52:40

V iných jazykoch

Táto stránka je v iných jazykoch

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