ubuntuusers.de

Name einer Variable aus Variable auslesen

Status: Ungelöst | Ubuntu-Version: Ubuntu 17.04 (Zesty Zapus)
Antworten |

Snycs

Anmeldungsdatum:
23. Mai 2016

Beiträge: Zähle...

Hallo zusammen, ich möchte gerne, den Inhalt einer Variable, die in einer gesourceten config steht. Dabei soll allerdings der Variablenname ebenfalls in einer Variable stehen. Ist das möglich, wenn ja wie?

Mit freundlichen Grüßen

Snycs

verdooft

Anmeldungsdatum:
15. September 2012

Beiträge: 4436

Vielleicht eignen sich die Pakete confget und crudini dafür.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9775

Wohnort: Münster

Snycs schrieb:

[…] Dabei soll allerdings der Variablenname ebenfalls in einer Variable stehen. […]

Indirekte Adressierung … (böse!). Geht in der Shell mit eval:

1
2
klaus@gnome25:~$ var1='Inhalt von var1' var2='$var1';  eval echo "$var2"
Inhalt von var1

eval ist evil! Anfängern ist es verboten und kluge Fortgeschrittene benutzen es aus eigener Einsicht nicht.

Snycs

(Themenstarter)

Anmeldungsdatum:
23. Mai 2016

Beiträge: 5

kB schrieb:

Indirekte Adressierung … (böse!). Geht in der Shell mit eval: eval ist evil! Anfängern ist es verboten und kluge Fortgeschrittene benutzen es aus eigener Einsicht nicht.

Gibt es denn eine Alternative zu indirekter Addressierung und warum ist das so böse? 0.o

Mit freundlichen Grüßen Snycs

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9775

Wohnort: Münster

Snycs schrieb:

[…] Gibt es denn eine Alternative zu indirekter Addressierung und warum ist das so böse?

Das hängt ab von der Programmaufgabe und den eigenen Programmierfähigkeiten und ist daher nicht allgemein zu beantworten. Man sollte komplizierte Techniken wie diese nach Möglichkeit meiden. Manchmal geht es nicht anders, oft aber eben doch.

Und böse ist es, weil man sich mit solchen Tricks selber Knoten ins Hirn macht!

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11267

Wohnort: München

Snycs schrieb:

Gibt es denn eine Alternative zu indirekter Addressierung

Das hängt vom genauen Problem an - man kann z.B. mit einem case-Statement arbeiten, wenn vorab bekannt ist, welche Namen die zweite Variable haben darf:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# in der Konfigurationsdatei
fruit=apple # chose one of apple, banana, orange

apple_color='#FF0000'
orange_color='#FFA500'
banana_color='#FFFF00' 

# im Skript
case "$fruit" in
  apple)
    color="$apple_color"
    ;;
  banana)
    color="$banana_color"
    ;;
  orange)
    color="$orange_color"
esac

Wenn man die Knoten im Hirn als Argument mal weglässt, ist das generelle Problem bei eval, dass jemand das u.U. dazu nutzen kann um ungewollt Code auf deinem System auszuführen - z.B.:

# in der Konfigurationsdatei
fruit='`rm ~/foo; echo apple`'

apple='#FF0000'
banana='#FFFF00'
orange='#FFA500'

# in deinem Skript
color="$(eval echo $fruit)"

Solange man nicht darauf vertrauen kann, dass einem da niemand ungewollt etwas in einer Konfigurationsdatei oder Umgebungsvariable unterschiebt, ist eval also nicht unbedingt das was man nutzen will.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Snycs schrieb:

... Dabei soll allerdings der Variablenname ebenfalls in einer Variable stehen. Ist das möglich, wenn ja wie?

Ich bin mir nicht ganz sicher, ob ich das richtig verstanden habe:
Willst Du eine Variable mit dem Namen derjenigen Variablen vorbelegen, deren Wert Du dann abrufen willst ?

Ja, sowas geht, das nennt sich indirekte Variablen-Expansion:

track@track:~$ var=obst
track@track:~$ obst=Apfel
track@track:~$ echo ${!var}
Apfel 

... geht bei der Shell aber nur in einem recht eng begrenzten Rahmen.

Wie meine Vorredner schon sagten:

  1. Du solltest etwas genauer verraten, was Du vorhast. Dann müssen wir nicht raten ...

  2. eval wäre vielleicht auch möglich, öffnet aber Tür und Tor für das Ausführen fremden, eingeschleusten Codes.
    Das macht man natürlich höchtens mal in einer klar definierten, geschützten Umgebung ! - >sonst ist es wirklich unsicher.

LG,

track

Antworten |