Hallo, Am Thu, 02 Oct 2003, Andreas Kyek schrieb: [..]
Und nochmal ich (ich komme mir vor, als führe ich Selbstgespräche!):
Ich habe noch ein bischen weiter geforscht. $(...) und `...` sind NICHT äquivalent. Schaut man sich mal genau an, was die bash da treibt:
------------------------------------------- linux:~> dat=`eval echo \\$datei$i` dat=`eval echo \\$datei$i` eval echo \$datei$i ++ eval echo '$datei1' echo $datei1 +++ echo test + dat=test -------------------------------------------
Die Variante funktioniert also.
Jep. Das \\ kommt _innerhalb_ der `` als ein \ an, und maskiert dann
also innerhalb der `` das $, d.h.:
Vor der ersten Auswertung: dat=`eval echo \\$datei$i`
Nach der ersten Auswertung: dat=`eval echo $datei1`
Nach der 2ten (eval) Ausw.: dat=`echo
------------------------------------------- linux:~> dat=`eval echo \$datei$i` dat=`eval echo \$datei$i` eval echo $datei$i ++ eval echo 1 echo 1 +++ echo 1 + dat=1 -------------------------------------------
Die funktioniert demnach nicht.
Hier faellt das '\' schon mit der ersten Auswertung raus. D.h.: Nach der ersten Auswertung: dat=`eval echo 1` (da $datei leer ist) Nachvollziehen kannst du das, in dem du mal $datei mit einem Wert belegst: $ i=1; datei=DATEI; set -x; dat=`eval echo \$datei$i`; set +x ++ eval echo DATEI1 +++ echo DATEI1 + dat=DATEI1
------------------------------------------- linux:~> dat=$(eval echo \$datei$i) dat=$(eval echo \$datei$i) eval echo \$datei$i ++ eval echo '$datei1' ^ ^ echo $datei1 +++ echo test + dat=test -------------------------------------------
Die hier funktioniert.
Komischerweise braucht die Konstruktion mit $(...) einen Backslash weniger. Kann mir das jemand erklären?
Das liegt daran, wie $() die Argumente uebergibt. Besser ist aber IMO, die Zuweisung mit ins 'eval' zu nehmen, dann faellt die subshell durch `` oder $() weg: $ i=1; datei=DATEI; datei1="foo"; set -x; eval "dat=\"\${datei${i}}\""; set +x + eval 'dat="${datei1}"' ++ dat=foo + set +x Das doppelte quoten ist nicht unbedingt immer noetig. -dnh -- If you don't see why, please stay the fuck away from my code. -- Paul "Rusty" Russel, in /usr/src/linux/Documentation/DocBook/kernel-locking.tmpl