Variablen und Ersetzungsproblem in Bash

L

laptop24

Grünschnabel
Moin,

ich hab da ein Problem, an dem ich seit Tagen sitze und keine Lösung finde. Vielleicht kann einer von euch da helfen.

Angenommen ich habe in einem Bash-Script dieses Kommando:

Code:
dialog --menu "Titel" 16 40 6 TAG1 "Punkt 1" TAG2 "Punkt 2"

Damit wird mir ein Menü angezeigt, dass aus zwei Zeilen besteht:

Code:
TAG1   Punkt 1
TAG2   Punkt 2

Nun möchte ich mein Menü dynamisch zur Script-Laufzeit aufbauen. Zu deutsch: wenn z.B. ein Verzeichnis existiert, dann soll im Menü der Punkt "F Verzeichnis füllen" auftauchen. Wenn weiterhin ein anderes Verzeichnis existiert, dann soll ein Menüpunkt "C Compilieren" im Menü erscheinen.

Das wollte ich so lösen, dass ich bei den entsprechenden Checks eine Variable mit dem Inhalt des Menüpunktes fülle.

Mit anderen Worten, ich möchte sowas machen (sinngemäß):

Code:
ITEM1=F "Verzeichnis füllen"
ITEM2=C "Quellen compilieren"

dialog --menu "Titel" 16 40 6 ${ITEM1} ${ITEM2}

Wo ist nun das Problem?

Als erstes kann man ITEM1 so nicht zuweisen.
Zweitens: was ich auch probiere, ich bekomme die zwei Parameter eines Menüpunktes nicht in einer Variable an dialog übergeben.

Wie kann ich das Problem lösen?
 
Entweder du nutzt ein Array, wobei Index 0 der Tag und Index1 item ist, oder du speicherst es in zwei Variablen.
Beides geht.
Code:
T1=F;
I1="Verzeichnis füllen";
T2="C";
I2="Quellen compilieren";

dialog --menu "Titel" 16 40 6 "$T1" "$I1" "$T2" "$I2";
# Array inititialisieren (leer) und Index auf 0;
A="()";
IN=0;
if ....
A[$IN]="F";
((IN++));
A[$IN]="Verzeichnis füllen";
((IN++));
fi
if ...
A[$IN]="C";
((IN++));
A[$IN]="Quellen compilieren";
((IN++));
fi
# weitere Tests, weitere Einträge wie gehabt

dialog --menu "Titel" 16 40 6 "${A[@]}";

Wenn es sehr viele Einträge werden, musst du natürlich die Höhe anpassen.
Die Anzahl der Zeilen bekommst du mit Arrayeinträge / 2 raus.
Code:
Z=$((${#A[@]}/2))

Gruß Wolfgang
 
Problem gelöst

Ich danke Dir Wolfgang. Das Problem ist mit dem Array gelöst.

Die erste Lösung funktioniert nicht. Denn wenn ich den Menüpunkt 1 z.B. ausblenden möchte, dann würde ich T1 und I1 gleich "" setzen oder löschen. Dann ergibt sich als Menüparameter:

Code:
dialog --menu "Titel" 16 40 6 "" "" "C" "Quellen compilieren"

Damit bekomme ich im angezeigten Menü eine nicht auswählbare leere Zeile, was ja nicht gewünscht ist.

Mit dem Array dagegen funktioniert es genau so, wie ich das will. Merkwürdigerweise habe ich das schon mit Arrays versucht und nicht hinbekommen. Jetzt muss ich mal analysieren, was ich anders gemacht habe.

Aber auf jeden Fall kannst Du Dir meines Dankes sicher sein.
 
Die erste Lösung würde auch funktionieren, wenn du vorher testest ob T1 und L1 leer ist, bevor du den zweiten Menüeintrag füllst. ;)
 

Ähnliche Themen

Queue für copy Script

Problem mit Rekursion in Bash / Funktioniert das überhaupt?

Displayport + externer Monitor zeigt bei startx nichts erst bei DVI

Modulfehler?

Festplatte friert ein nach suspend/resume

Zurück
Oben