Hallo, Am Fri, 03 Oct 2003, Al Bogner schrieb:
Am Freitag, 3. Oktober 2003 19:33 schrieb David Haller: [..] Wie lautet nun die korrekte "eval-Syntax"?
i=1 dir1=/home/ab/dir\ mit\ blank1/ dir=$(eval echo "\$dir$i") #gefragt ist der "Inhalt von dir1" echo $dir #ist so leer
So wie ich es dir im Beispiel-script geschrieben habe.
==== test_blanks.sh ====
Ich muß das noch erst genauer überlegen. Jedenfalls ist es nicht mit 1 Befehlszeile zu realisieren. Vielen Dank!
Dein Fehler ist falsches quoten (sic!). Es geht auch mit dem von dir
verwendeten `eval echo $dir`, allerdings eben nur, wenn man ebenso
korrekt quotet.
==== test_blanks.sh ====
#! /bin/bash
#set -x
dir1="./dir mit blank"
dir2="./bin dir"
dir3="./foo bar"
#dir4="./bla blubb"
i=0
while test $i -lt 3
do
i=$(( i + 1 ))
eval "dir=\"\${dir$i}\""
test -d "$dir" && echo "existiert1: dir='$dir'" || echo "NO1: '$dir'"
dir="$(eval echo \"\${dir$i}\")"
test -d "$dir" && echo "existiert2: dir='$dir'" || echo "NO2: '$dir'"
dir="`eval echo \"\\${dir$i}\"`"
test -d "$dir" && echo "existiert3: dir='$dir'" || echo "NO3: '$dir'"
done
====
Da die letzteren beiden Variante (die mit $() bzw. ``) ein sub-shell
aufrufen sind diese _deutlich_ langsamer als die direkt ablaufende
erste Version.
Und ja, obiges sind die 3 moeglichen "richtigen" Varianten.
Die "eval-Syntax" hat mit deinem Problem naemlich nix zu tun:
====
$ help eval
eval: eval [arg ...]
Read ARGs as input to the shell and execute the resulting
command(s).
====
genauer dann in man bash:
====
eval [arg ...]
The args are read and concatenated together into a
single command. This command is then read and exe
cuted by the shell, and its exit status is returned
as the value of eval. If there are no args, or
only null arguments, eval returns 0.
====
Dein Problem war wohl, dass du das flasch quoten mit einem
"Syntax-Fehler" verwechselt hast, bzw. missverstanden, was "eval"
macht. eval wertet die Kommando-Zeile einfach nochmal aus:
eval "dir=\"\${dir$i}\""
Erste (normale) Auswertung liefert:
eval dir="${dir1}"
Jetzt kommt die zweite Auswertung durch das "eval", und die shell
expandiert das '${dir1}' zum Inhalt der Variablen:
dir="