ubuntuusers.de

Werte in Variable summieren

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

Aquari559

Anmeldungsdatum:
26. Juni 2015

Beiträge: Zähle...

Hallo,

ich bin blutiger Anfänger in Shellskriptprogrammierung und die folgende Fragestellung wird sicherlich schnell beantwortet sein:

ich habe eine Variable in der zeilenweise (beliebige Länge) verschiedene Zahlen stehen, z. B.:

4
10
3000
1
0
500

Ich möchte die Summe dieser Werte ermitteln. Was ist dabei zu tun? Kann jemand weiterhelfen?

Vielen Dank für die Hilfe! Aquari559

Bearbeitet von rklm:

Formatierung. Bitte beachte Forum/Syntax!

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13177

Herzlich willkommen hier im Forum!

Aquari559 schrieb:

Ich möchte die Summe dieser Werte ermitteln. Was ist dabei zu tun? Kann jemand weiterhelfen?

Ja, das geht recht einfach mit awk. In welchem Zusammenhang ist Dir denn diese Aufgabe begegnet?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Hi Aquari559,

erstmal herzlich willkommen hier auf dem Forum !

Der Vorschlag von Robert wäre auch für mich die 1. Wahl, weil er sehr bequem ist. Allerdings liest awk erstmal aus einer Datei.

Du sagst, dass die Werte in einer Variablen stehen  ...? (einer Shell-Variablen, nehme ich an ?)
In dem Fall ginge das auch recht gut innerhalb der Shell mit ihren Bordmitteln.

Das einfachste wäre wohl, die Zahlen mit einer for-Schleife abzugrasen
und in der Schleife direkt mit der Shell Arithmetik auf zu addieren:

track@lucid:~$ var='4
> 10
> 3000
> 1
> 0
> 500'
track@lucid:~$ for i in $var ; do (( summe += i )) ; done
track@lucid:~$ echo $summe
3515 

LG,

track

TausB

Avatar von TausB

Anmeldungsdatum:
26. November 2009

Beiträge: 1570

Wohnort: Terra incognita

Oder (geht auch ohne Schleife 😛 ):

1
2
3
4
5
6
7
zahlen="2
3
6
7
8"

echo "Summe: $((${zahlen//$'\n'/+}))"

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13177

TausB schrieb:

Oder (geht auch ohne Schleife 😛 ):

Sehr schick! 👍 👍 👍

TausB

Avatar von TausB

Anmeldungsdatum:
26. November 2009

Beiträge: 1570

Wohnort: Terra incognita

rklm schrieb:

TausB schrieb:

Oder (geht auch ohne Schleife 😛 ):

Sehr schick! 👍 👍 👍

Danke! 😳 - Ein Lob von Dir ehrt mich sehr. 😎

Mooi

Anmeldungsdatum:
15. August 2014

Beiträge: 187

Erst den Mund wässrig machen und dann nicht mit der awk-Lösung rausrücken ist gemein. 😀

awk '{sum+=$1}END{print sum}' <<<"$var"

Jetzt kriege ich zwar von den Portabilitätsterroristen [Scherz!] den Herestring um die Ohren gehauen, aber der Code ist leicht anpassbar, falls doch eine Datei gemeint ist.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13177

Mooi schrieb:

Erst den Mund wässrig machen und dann nicht mit der awk-Lösung rausrücken ist gemein. 😀

Es ist nicht ganz unwahrscheinlich, dass es sich um eine Übungsaufgabe handelt. Ich unterstütze es nicht, in solchen Fällen gleich die Lösung zu präsentieren. Zumal man die in diesem Fall extrem leicht im Netz findet, wenn man mal die Stichwörter "sum" und "awk" verwendet.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

TausB schrieb:

Oder (geht auch ohne Schleife 😛 ):

1
echo "Summe: $((${zahlen//$'\n'/+}))"

Heey, das ist gemein: nur einfach 'ne Zauberformel hinschreiben und nicht zu verraten, was die macht !

Wie soll der arme Aquari559 denn wissen, dass das innen eine Shell Parameter Expansion ist mit dem ANSI-C Quoting-Trick, und einer Arithmetic Expansion drum herum ?

Du hättest ihm ruhig verraten dürfen, was die jeweils genau machen. 😉 (Dass Du das kannst, wissen wir doch !)

track@lucid:~$ var='4
10
3000
1
0
500'
track@lucid:~$ echo "${var//$'\n'/+}"
4+10+3000+1+0+500
track@lucid:~$ echo "$(( ${var//$'\n'/+} ))"
3515 

Mensch, sei doch mal ein bisschen nett zu dem "Neuen" ! 😛

LG,

track


p.s.: ... und das selbe mit dem Here String beim Mooi 😉

TausB

Avatar von TausB

Anmeldungsdatum:
26. November 2009

Beiträge: 1570

Wohnort: Terra incognita

track schrieb:

Heey, das ist gemein: nur einfach 'ne Zauberformel hinschreiben und nicht zu verraten, was die macht !

Ich orientiere mich da am Treadstarter: Fragt er spartanisch, bekommt er eine spartanische Antwort. ☺

Wie soll der arme Aquari559 denn wissen, dass das innen eine Shell Parameter Expansion ist mit dem ANSI-C Quoting-Trick, und einer Arithmetic Expansion drum herum ?

Das hätte ich selber nie so ausdrücken können ... 😛

Du hättest ihm ruhig verraten dürfen, was die jeweils genau machen. 😉

Siehe oben - wer Interesse hat, forscht und fragt gezielt nach (ich hielt es auch für eine Übungsaufgabe). Nur wer sich selber mit etwas beschäftigt, wird es dauerhaft lernen.

Mooi

Anmeldungsdatum:
15. August 2014

Beiträge: 187

Das mit den Übungsaufgaben ist so eine Sache. Ich denke dabei oft an meine eigene Situation: Englische Texte sind eine Qual für mich, deshalb lese und schreibe ich lieber kleine, funktionierende Beispielcodes mit kurzen Hinweisen in deutscher Sprache.

Deshalb liebe ich dieses Brett: Hier darf man diese Art des Lernens und Lehrens praktizieren, ohne von RTFM-Fetischisten angepöbelt zu werden.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13177

Mooi schrieb:

Das mit den Übungsaufgaben ist so eine Sache. Ich denke dabei oft an meine eigene Situation: Englische Texte sind eine Qual für mich, deshalb lese und schreibe ich lieber kleine, funktionierende Beispielcodes mit kurzen Hinweisen in deutscher Sprache.

Schwierigkeiten mit Englisch sind in der IT immer ein Nachteil. Aber unabhängig davon ist es doch so: Übungsaufgaben - sei es in der Schule, Universität oder wo auch immer - sind normalerweise so angelegt, dass der Lernende sie lösen kann. Und nur dadurch, dass er oder sie es selbst tut, lernt er / sie ja. Man gewinnt schlicht nichts durch Abkürzungen.

Deshalb liebe ich dieses Brett: Hier darf man diese Art des Lernens und Lehrens praktizieren, ohne von RTFM-Fetischisten angepöbelt zu werden.

Das machen wir ja auch gerne. Nur sehe ich es halt nicht so, dass ich jemandem helfe, indem ich seine (Lern-) Arbeit mache. Und, wenn man sich die Fragestellung anschaut, dann spricht mehr dafür, dass es tatsächlich eine Übungsaufgabe ist, als, dass es keine ist. Deshalb habe ich auch nachgefragt.

Antworten |