Re: Bash-Frage
Am Mittwoch, den 02.10.2013, 01:06 +0200 schrieb Andre Tann:
> Hallo zusammen,
>
> folgendes ist mir nicht ganz klar:
>
> $ a="x
> > y
> > z"
>
> $ echo $a
> x y z
>
> $ echo "$a"
> x
> y
> z
>
> Warum wird das unterschiedlich dargestellt?
Beim ersten echo-Befehl werden alle Zeichen die auch in der Variable
$IFS vorhanden sind, mit einem Space ersetzt, da $a nicht gequotet ist.
Mehrere, nicht druckbare (whitespace) IFS-Zeichen in Folge, werden zu
einem zusammengefasst.
Beim zweiten echo-Befehl ist $a gequotet, wodurch der enthaltene String
nicht nach IFS-Zeichen durchsucht und geändert wird.
Der Inhalt wird so übergeben wie er ist.
Die Variable IFS ist per Default mit " \t\n" (<space><tab><newline>)
belegt.
Beispiel:
$ a="x y z"
$ echo $a
x y z
$ echo "$a"
x y z
$ echo -n "$IFS" | od -cx
0000000 \t \n
0920 000a
$ IFS="\n"
$ echo $a
x y z
$ echo "$a"
x y z
Deshalb ist es in bash-Scripten (besser in shell-Scripten) immer wichtig
auf das richtige quoting zu achten.
Genaueres findest du in der man-page der bash mit dem Stichwort IFS.
>
> Ähnlicher Fall:
>
> $ ls
> a b c
>
> $ ls | grep b
> b
>
> $ echo a b c | grep b
> a b c
>
> Wieso kann ich die Datei namens b herausgreppen, obwohl doch a, b und c in einer Zeile ausgegeben werden? Wo liegt der Unterschied zwischen der Ausgabe von ls und echo?
>
> Ah, ich sehe einen:
>
> $ ls | od -cx
> 0000000 a \n b \n c \n
> 0a61 0a62 0a63
>
> Wieso wird \n in der Ausgabe von ls nicht als newline dargestellt, hier aber schon:
>
> $ echo -ne "a\nb"
> a
> b
ls prüft wohin seine Ausgabe geht.
Rufst du nur ls auf, ohne Pipe, sodaß die Ausgabe direkt an die Shell
geht, beinhaltet die Ausgabe kein newline.
Stellt ls fest, daß seine Ausgabe umgeleitet wird, fügt es newlines ein,
damit die Ausgabe besser weiterverarbeiten werden kann (sowie 'ls -1').
--
Sascha Reißner <reiszner@novaplan.at>
Reply to: