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
|
rklm
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
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
Anmeldungsdatum: 26. November 2009
Beiträge: 1570
Wohnort: Terra incognita
|
Oder (geht auch ohne Schleife 😛 ):
| zahlen="2
3
6
7
8"
echo "Summe: $((${zahlen//$'\n'/+}))"
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13177
|
TausB schrieb: Oder (geht auch ohne Schleife 😛 ):
Sehr schick! 👍 👍 👍
|
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
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
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
TausB schrieb: Oder (geht auch ohne Schleife 😛 ):
| 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
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
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.
|