eval echo \$foo_${a} - casting zuweisen? [gelöst]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
xcomm
Beiträge: 804
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

eval echo \$foo_${a} - casting zuweisen? [gelöst]

Beitrag von xcomm » 31.10.2009 15:23:46

Hi Gemeinde,

Code: Alles auswählen

export a=1
export foo_1="bar"

echo $foo_1
 bar

eval echo \$foo_${a}
 bar

Könnt Ihr mir mal bitte helfen - wie kann ich das nun einer anderen Variablen zuweisen?

Code: Alles auswählen

andere="`eval echo \$foo_${a}`"
echo $andere
 1
Danke, xcomm
Zuletzt geändert von xcomm am 31.10.2009 18:25:34, insgesamt 1-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: eval echo \$foo_${a} - casting zuweisen?

Beitrag von Meillo » 31.10.2009 15:32:58

Da ist ein zweiter Backslash nötig. Dieser wird von den Backticks entfernt (wenn man's mal ganz flapsig sagt).
Use ed once in a while!

123456
Beiträge: 6126
Registriert: 08.03.2003 14:07:24

Re: eval echo \$foo_${a} - casting zuweisen?

Beitrag von 123456 » 31.10.2009 15:35:47

Code: Alles auswählen

andere=$(eval echo \$foo_${a})

Benutzeravatar
xcomm
Beiträge: 804
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

Re: eval echo \$foo_${a} - casting zuweisen?

Beitrag von xcomm » 31.10.2009 18:25:14

Hi Meillo, hi ub13,

besten Dank, so tut es! :-)

Code: Alles auswählen

andere=$(eval echo \\$foo_${a})
oder

Code: Alles auswählen

andere=$(eval echo \$foo_${a})
Warum benötigt die Backticks Substitution denn ein Backslash mehr?

Best regards, xcomm

Benutzeravatar
xcomm
Beiträge: 804
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

Re: eval echo \$foo_${a} - casting zuweisen? [gelöst]

Beitrag von xcomm » 31.10.2009 18:58:25

Hi Ihr,

noch ein Nachtrag.

Wie kann ich dieser dynamischen Variablen, wieder etwas zuweisen?

Code: Alles auswählen

foo_${a}=""
Regards, xcomm

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: eval echo \$foo_${a} - casting zuweisen?

Beitrag von Meillo » 31.10.2009 19:06:10

xcomm hat geschrieben:Warum benötigt die Backticks Substitution denn ein Backslash mehr?
Liegt wohl daran, dass die Zeile einmal öfter von der Shell interpretiert wird. Bei jedem Mal wird ein Backslash entfernt.

Die neuere $(...)-Version braucht das wohl nicht, deshalb ist dort kein weiterer Backslash nötig.

Bei der alten Variante hat man's aus Kompatibilitätsgründen nicht geändert; bei der neuen Variante hat man's wohl gleich geschickter gemacht.

So habe ich mir das mal zusammengereimt. Weshalb und wo genau die weitere Interpretation durch die Shell stattfindet kann ich aber nicht sagen. Da müsste ich schon ausführlicher Nachdenken, länger im Netz suchen, oder in den Code schauen.

Was ich gefunden habe ist dieser Satz in der SUS:
http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html hat geschrieben:Within the backquoted style of command substitution, backslash shall retain its literal meaning, except when followed by: '$', '`', or '\' (dollar sign, backquote, backslash).
Nur ich weiß nicht so recht was er mir sagen will. ;-)
Use ed once in a while!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: eval echo \$foo_${a} - casting zuweisen?

Beitrag von gms » 31.10.2009 19:15:30

bei der alten Version muß zusätzlich escaped werden, damit eine Verschachtelung möglich wird:

Code: Alles auswählen

echo `echo \$(echo \`echo a\`b)c`
bei der neuere Version geht das einfacher:

Code: Alles auswählen

echo $(echo $(echo $(echo a)b)c)
Gruß
gms

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: eval echo \$foo_${a} - casting zuweisen?

Beitrag von Meillo » 01.11.2009 15:00:17

gms hat geschrieben:bei der alten Version muß zusätzlich escaped werden, damit eine Verschachtelung möglich wird:

Code: Alles auswählen

echo `echo \$(echo \`echo a\`b)c`
Aber wenn man nur die Backtick-Variante verwendet, dann müsste ein $ doch eigentlich nicht escaped werden müssen. Das Problem kommt nur dann auf wenn man $(...) mit rein verschachtelt, oder?
Use ed once in a while!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: eval echo \$foo_${a} - casting zuweisen?

Beitrag von gms » 01.11.2009 16:22:58

Meillo hat geschrieben:
gms hat geschrieben:bei der alten Version muß zusätzlich escaped werden, damit eine Verschachtelung möglich wird:

Code: Alles auswählen

echo `echo \$(echo \`echo a\`b)c`
Aber wenn man nur die Backtick-Variante verwendet, dann müsste ein $ doch eigentlich nicht escaped werden müssen. Das Problem kommt nur dann auf wenn man $(...) mit rein verschachtelt, oder?
Ich bin mir jetzt nicht sicher was du meinst, denn das $, als Bestandteil von Variablen, muß innerhalb von verschachtelten Backticks auch escaped werden:

Code: Alles auswählen

v=abcdefg
a=1
len() { echo $(( $1 * 2 )); }
e=`echo \${v:\$a:\`len \\\$a\`}`
echo $e
gleiches würde natürlich auch für Arithmetic Expansion "$(( .... ))" gelten

Gruß
gms

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: eval echo \$foo_${a} - casting zuweisen?

Beitrag von Meillo » 01.11.2009 16:37:23

gms hat geschrieben:
Meillo hat geschrieben:
gms hat geschrieben:bei der alten Version muß zusätzlich escaped werden, damit eine Verschachtelung möglich wird:

Code: Alles auswählen

echo `echo \$(echo \`echo a\`b)c`
Aber wenn man nur die Backtick-Variante verwendet, dann müsste ein $ doch eigentlich nicht escaped werden müssen. Das Problem kommt nur dann auf wenn man $(...) mit rein verschachtelt, oder?
Ich bin mir jetzt nicht sicher was du meinst
Du schreibst: $ muss in der Backtick-Variante escaped werden um verschachtelte Backticks zu erlauben. In der $(...)-Variante ist das nicht nötig weil man dort auch ohne Escapes verschachteln kann.

Ich denke mir: Wozu muss das $ escaped werden, eigentlich reicht es doch, wenn man verschachtelte Backticks escapen muss. Außer man würde $(...) innerhalb von Backticks einbauen, denn dann müsste man das $ escapen.

.... oder denke ich nur ganz verrückt durch die Gegend und das was ich von mir gebe kann man gar nicht verstehen? Ehrlich gesagt hat's in meinem Kopf schon einen Knoten vom Verschachtelungen und mehrfachen Escapes durchdenken. ... vielleicht sollte ich ja auch einfach mal in den Code schauen um zu sehen wie das tatsächlich abläuft bevor ich weiter versuche das theoretisch zu durchdenken.

Ist eigentlich auch nicht so wichtig. (Ich merk's mir einfach für 'ne Unix-Guru-Runde, falls ich mal zufällig in eine reinstolpern sollte. ;-) )
Use ed once in a while!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: eval echo \$foo_${a} - casting zuweisen?

Beitrag von gms » 01.11.2009 16:48:41

Meillo hat geschrieben:[
Ich denke mir: Wozu muss das $ escaped werden, eigentlich reicht es doch, wenn man verschachtelte Backticks escapen muss. Außer man würde $(...) innerhalb von Backticks einbauen, denn dann müsste man das $ escapen.
wäre das nicht eigentlich schon Grund genug :?

was ich jedoch überhaupt nicht verstehe: warum reduzierst du das jetzt auf das $ in der Command Substitution $(...), wenn es doch diverse andere Ersetzungen gibt, in denen das $ genaus vorkommt. Wenn diese dann in verschachtelten Backticks vorkommen, spezifizierst du durch das Escapen, in welcher Verschachtelungstiefe die entsprechende Ersetzung stattfinden soll.
hm, ich versuche mir ein brauchbareres Beispiel auszudenken, wenn ich diesbezüglich nur nicht so einfallslos wäre :roll:

Gruß
gms

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: eval echo \$foo_${a} - casting zuweisen?

Beitrag von Meillo » 01.11.2009 17:13:31

gms hat geschrieben:Wenn diese dann in verschachtelten Backticks vorkommen, spezifizierst du durch das Escapen, in welcher Verschachtelungstiefe die entsprechende Ersetzung stattfinden soll.
Danke, das war die richtige Erklärung. Jetzt ist's klar. :-)
Use ed once in a while!

Antworten