ubuntuusers.de

Bash: Variablen in Schleife um 1 erhöhen

Status: Gelöst | Ubuntu-Version: Xubuntu 24.04 (Noble Numbat)
Antworten |

glaskugel

Anmeldungsdatum:
8. Juli 2010

Beiträge: 3614

Nehmen wir an es gibt einen Zähler i, der durch eine Schleife erhöht wird.

Nun soll bei i=1 eine Variable var1 als Variable definiert werden

danach in jeder Schleife der Variablenname am Ende durch den Zähler angepasst werden,

also in etwa so:

#var$i= funktioniert nicht

var1=...
var2=...
var3=...

Der Inhalt der Variable ist dann ein sed-Konstrukt mit unterschiedlichen Zeilen einer anderen Variable, soll aber egal sein.

micneu

Avatar von micneu

Anmeldungsdatum:
19. Januar 2021

Beiträge: 705

Wohnort: Hamburg

Wo ist jetzt das Problem?

i=1; y=0; for x in {A..D}; do echo "$x -- $i"; y=$x$i; echo "$y"; i=$((i + 1)); done

code getestet unter macOS

PS: Du hast über 3000 Beiträge, du musst doch schon lange ein Profi sein, im Vergleich zu dir bin ich ja noch ein Einsteiger

Kreuzschnabel

Anmeldungsdatum:
12. Dezember 2011

Beiträge: 1345

glaskugel schrieb:

var1=...
var2=...
var3=...

Spricht was dagegen, einfach ein Array zu verwenden? Das ist doch einklich für „durchzählbare“ Variablenfelder gedacht.

var[1]=
var[2]=
var[3]=

--ks

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13131

glaskugel schrieb:

Der Inhalt der Variable ist dann ein sed-Konstrukt mit unterschiedlichen Zeilen einer anderen Variable, soll aber egal sein.

Was genau hast Du vor?

CarstenHa

Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 138

Du möchtest wahrscheinlich sowas in der Art haben, oder?

1
2
3
4
5
6
7
8
9
#!/bin/bash

for i in {1..3}; do
 eval var$i="'Nr:     ${i}'"
done

echo "$var1"
echo "$var2"
echo "$var3"

Gruß

Carsten

CarstenHa

Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 138

Wenn du einen Counter in dein Schleifenkonstrukt einbinden möchtest, dann geht das zum Beispiel so:

1
2
3
4
counter=0
for ...; do
 let counter++
done

'...' musst du natürlich noch nach deinen Vorstellungen anpassen.

CarstenHa

Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 138

Kreuzschnabel schrieb:

glaskugel schrieb:

var1=...
> var2=...
> var3=...

Spricht was dagegen, einfach ein Array zu verwenden? Das ist doch einklich für „durchzählbare“ Variablenfelder gedacht.

var[1]=
var[2]=
var[3]=

--ks

Und eine weitere Möglichkeit, wie Kreuzschnabel es schon angedeutet hat:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/bash

# Dasselbe Ergebnis mit assoziativem Array.
for i in {1..3}; do
 var["$i"]="Nr:     ${i}"
done

echo "${var[1]}"
echo "${var[2]}"
echo "${var[3]}"

P.S. Frohes neues Jahr Euch allen ☺

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7777

Dynamische Variablennamen kannst du unter Bash mit declare benutzen. Sonst eben als Array.

In anderen Shells kann man auch die positionalen Parameter $1 $2 $3 wie ein Array verwenden (mit set). Manchmal reicht das.

CarstenHa

Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 138

frostschutz schrieb:

Dynamische Variablennamen kannst du unter Bash mit declare benutzen. Sonst eben als Array.

In anderen Shells kann man auch die positionalen Parameter $1 $2 $3 wie ein Array verwenden (mit set). Manchmal reicht das.

Jo stimmt. Das mit declare ist wohl die beste Lösung.

1
2
3
4
5
6
7
for i in {1..3}; do
 declare var$i="Nr:     ${i}"
done

echo "$var1"
echo "$var2"
echo "$var3"

eval kann ja auch sehr schnell tricky werden.

glaskugel

(Themenstarter)

Anmeldungsdatum:
8. Juli 2010

Beiträge: 3614

eval kann ja auch sehr schnell tricky werden.

So ist es, verwende ich schon im umgekehrten Fall

Ein Array, ist auch nicht ohne, wenn man es nach Jahren verstehen will

Ein Array wäre programmiertechnisch sicher am effektivsten.

Was genau hast Du vor?

Weiß ich selber noch nicht, sorry für die Antwort. Ich habe ein altes Script, das ich neu schreiben will, weil sich an den Voraussetzungen soooo viel geändert hat und die Anpassungen funktionieren, aber schwer zu verstehen sind. Ich weiß noch nicht was ich rauswerfe, etc. Ich fange einfach mal an.

Die Frage hat sich erübrigt. Ich habe eine simplere Logik ohne dieser automatischen Variablennummerierung gefunden. Ich blicke nach Jahren besser durch, wenn es nicht zu kurz ist. So Variablen, die durch mehrere andere Variablen verschachtelt sind, können ganz schön schwierig zu verstehen sein, wenn etwas unerwartet nach Anpassung der Bedingungen nicht wie gewünscht funktioniert.

Der Haken liegt im Detail, zB bei sed, wenn die Variable / enthält, muss man die ein 2. Mal für sed gequotet erstellen und für den sed-Befehl " statt ' verwenden, etc.

Danke

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13131

glaskugel schrieb:

Ein Array wäre programmiertechnisch sicher am effektivsten.

Auf jeden Fall.

Was genau hast Du vor?

Weiß ich selber noch nicht, sorry für die Antwort.

Oh.

Ich habe ein altes Script, das ich neu schreiben will, weil sich an den Voraussetzungen soooo viel geändert hat und die Anpassungen funktionieren, aber schwer zu verstehen sind. Ich weiß noch nicht was ich rauswerfe, etc. Ich fange einfach mal an.

Immerhin hast Du eine Version, an der Du gelernt hast, und kannst jetzt besser planen. Erinnert mich an den "Mythical Man Month" von Fred Brooks, der die Maxime vorgeschlagen hat "plan to throw one away": man baut eine Version und lernt dabei, wie es besser geht. Dann schmeißt man die erste Version weg und baut eine zweite Version.

Kreuzschnabel

Anmeldungsdatum:
12. Dezember 2011

Beiträge: 1345

glaskugel schrieb:

Ein Array, ist auch nicht ohne, wenn man es nach Jahren verstehen will

Ein Array wäre programmiertechnisch sicher am effektivsten.

Um seinen eigenen Code nach Jahren noch bzw. wieder zu verstehen, bietet jede höhere Sprache die Möglichkeit, Kommentare reinzuschreiben ☺ nichts für echte™ Männer, ist klar.

--ks

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4658

Wohnort: Berlin

Naja, Kommentare sind für Sachen die nicht in der Dokumentation stehen, nicht für so grundlegende Dinge wie # Das hier ist ein Array und das funktioniert folgendermassen….

Für Sprachkonstrukte schreibt man sich besser einen Spickzettel, neudeutsch Cheatsheet, oder sucht sich so etwas fertig im Netz. Wobei beim selber schreiben der Lerneffekt in der Regel höher ist.

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6467

Wohnort: Hamburg

Das mit den Kommentaren kenne ich. Ich musste Anfangs der 70-er Jahre mein erstes Fortran IV Programm abliefern. Kommentare waren da eher lästig. Inzwischen habe ich aber erkannt, dass die wirklich nötig sind. Ich kämpfe auch bei aktuellen Programmen, nach kurzer Zeit, immer wieder mit fehlenden Informationen, die ich dann nachliefern muss.

Aktuell habe ich aber das Problem, dass man für manche Dokumentationen eigentlich Zeichnungen (Diagramme) benötigt, die man aber schlecht als Kommentar einfügen kann.

Fazit: egal wie man es angeht, gute Dokumentation bleibt ein Problem.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13131

Dakuan schrieb:

Aktuell habe ich aber das Problem, dass man für manche Dokumentationen eigentlich Zeichnungen (Diagramme) benötigt, die man aber schlecht als Kommentar einfügen kann.

doxygen kennst Du?

Fazit: egal wie man es angeht, gute Dokumentation bleibt ein Problem.

Eine der ewigen Wahrheiten der Softwareentwicklung. Kein Wunder, denn die Doku hinkt immer hinterher. Oder macht die KI das jetzt mit Links? 😉

Antworten |