Suma a n numere introduse de la tastatură în bash script

0

Problema

În primul rând, îmi pare rău pentru "engleza mea".

Trebuie să fac un script care cere pentru numere trecut la tastatură și de a le adăuga în sus și arată suma acumulată. Și programul se va încheia atunci când introduceți un număr negativ.

Am făcut următorul script care funcționează, dar nu sunt convins cu utilizarea de următoarele în pentru a folosi ca un acumulator, acesta nu a avut loc pentru mine să fac orice alt mod.

Modalități de a face mai ... Elegant ??

Edit: Elegant nu este cuvântul, dar dacă ceea ce fac este corect în bash sau există o modalitate de a face "normative" sau "puțin ciudat"...

Multumesc!!!

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

În primul rând, puteți utiliza următoarele bash funcția:

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

A doua modalitate este de a face un non-looping varianta:

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

Exemplu

A pus mai sus într-un fișier script, suma.

#!/bin/bash

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

Rulați astfel:

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

Pentru cel de-al treilea mod în care pot recomanda :

Nu este nevoie pentru bash, pur sh va face la fel de bine:

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

$* în POSIX scoici, se extinde la lista de parametrii de poziție (în acest caz, argumentele pentru a script-ul) separate de primul caracter al $IFS (sau spațiu, dacă $IFS este dezactivat sau nimic dacă $IFS este gol). $((...)) este învelișul intern aritmetică expansiune operator (rețineți că se acceptă zecimal, octal și numere hexazecimale)

Dacă aveți nevoie plutitoare punct de sprijin, care este în cazul în care veți avea nevoie de o coajă diferite ca ksh93 sau zsh (nu bash bash acceptă numai aritmetică întreg), deși ai putea folosi, de asemenea, awk:

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

Care va folosi timp (pentru întreg) și dublu (pentru virgulă mobilă) de tip numere cum sunt puse în aplicare de către sistem. La numerele de intrare trebuie să fie zecimal în virgulă mobilă sau inginerie notație în stil englezesc (floating point delimitator este perioada de caracter indiferent de localizare). Cu unele awk implementări, acesta va eșua în cazul în care primul număr este negativ ca awk ar încerca să-l interpreteze ca o opțiune.

Unele awk implementari ca GNU awk când POSIXLY_CORRECT este în mediu, de asemenea, sprijin hexadecimals inclusiv cu binare exponent notații. Sau cu ... non-zecimal-date, se înțelege octals și hexadecimals:

$ 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

urm $num $num prezinta numere secvențiale de la $la num $num și nu este nici elegant, nici corect aici.

Aș scrie așa:

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

Ca în fiecare tocilar eu am propria mea bash scripting tutorial, vezi http://linuxintro.org/wiki/BaBE

2021-11-28 12:52:40

În alte limbi

Această pagină este în alte limbi

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