Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verhalten der Bash in Bezug auf Variablen welches ich nicht verstehe



d@tenmaulwurf
05-05-2009, 16:07
Moin!

Ich erfahre grad ein Verhalten der Bash, welches mir nicht in den Kopf will:



$ echo -e "foo\nbar"
foo
bar
$
#
$ foo="`echo -e \"foo\nbar\"`"
$ echo "$foo"
foo
bar
$


Beides gibt - wie zu erwarten das Selbe aus.
Hingegen ist mir Folgendes nicht verständlich:



$ echo -e "\n\n\n\n"





$
#
$ foo="`echo -e \"\n\n\n\n\"`"
$ echo "$foo"

$
#
$ echo -e "$foo"

$


Kann mir jemand erklären, warum aufeinander folgende newlines in einem echo-command scheinbar nicht in einer variablen gespeichert bzw. diese ausgegeben werden können?

Vielen Dank im voraus,

d@ten

jan61
05-05-2009, 19:21
Moin,

Deine innere echo-Ausgabe wird als leere Variable betrachtet. Der äußere echo kriegt ja keine Steuerzeichen mehr mit, hier sind sie in Linefeed umgewandelt. Damit ist die Variable leer (ist das Gleiche, als wenn Du 'echo<Return>' eingibst; wieviele <Return>'s das sind, ist egal):


jan@jack:~> echo "[`echo -e "\n\n\n\n"`]"
[]
jan@jack:~> echo "[`echo -e "1\n\n\n\n"`]"
[1]
jan@jack:~> echo "[`echo -e "1\n2\n\n\n"`]"
[1
2]
Du kannst Dir angucken, wie die Shell das auflöst:

jan@jack:~> bash
jan@jack:~> set -x
jan@jack:~> echo "[`echo -e "\n\n\n\n"`]"
++ echo -e '\n\n\n\n'
+ echo '[]'
[]
jan@jack:~> exit


Jan

panzi
09-05-2009, 14:27
kA obs einen eleganteren Weg gibt:


foo="`echo -e 'x\n\n\n\n\n\n\nx'`"
foo="${foo:1:$((${#foo}-2))}"
echo "$foo"

http://tldp.org/LDP/abs/html/string-manipulation.html

panzi
09-05-2009, 14:28
Ah, das scheint auch zu funktionieren (beides nur mit bash getestet):


foo='




'
echo "$foo"

BLUESCREEN3D
10-05-2009, 14:12
foo=$'\n\n\n\n\n'