2016-12-06 4 views
1

Unten ist mein Spielzeug ProgrammShell-Ausgabe mehrzeiliger Text unter bash?

[email protected]:~/Desktop$ foo=$'line1\nline2' 
[email protected]:~/Desktop$ echo $foo 
line1 line2 
[email protected]:~/Desktop$ echo "$foo" 
line1 
line2 

Ich weiß Quoting-Mechanismus in Kommandosprache Shell. Meine Erwartung ist, dass zwei Echo-Befehle dasselbe ausgeben würden, da Dollar-Zeichen sowieso ein Meta-Zeichen im Klartext und Doppel-Qouting sind. Warum ist es anders? Ist es eine verschachtelte Qutation?

+1

@DevNull Danke, ich wusste diesen Weg. Mein wirkliches Problem ist, warum sich echo $ foo und echo "$ foo" hier anders verhalten – nathan

+0

Ahh, nachdem ich die akzeptierte Antwort gesehen habe, sehe ich, wonach du gesucht hast. Gut, dass es sich ausgezahlt hat. Prost! – DevNull

Antwort

3

Der Unterschied zwischen den notierte und nicht notierte Versionen auf Ihrer Shell abhängen kann, aber am wahrscheinlichsten ist:

  • zitiert, "$foo" ein einziges Argument darstellt, die an den echo Befehl übergeben, die sie wörtlich druckt, gefolgt durch eine neue Zeile.
  • nicht quoted, $foo erweitert zu einer Reihe von Argumenten getrennt durch $IFS. Wenn $IFS nicht festgelegt ist, wird standardmäßig ein Leerzeichen verwendet. Wenn es kein Feldtrennzeichen gibt, haben Sie nur ein Feld.

In der nicht notierten Version, gibt es keinen Grund zu erwarten, dass die Newline einen Teil der Ausgabe berücksichtigt werden, da es nicht einmal wirklich Teil des Eingangs zum echo Befehl ist. Es trennt einfach Argumente.

Wenn Sie dieses Verhalten ändern möchten, können Sie Ihre $IFS Einstellung ändern, aber ich empfehle es nicht. Ändern Sie IFS, wenn Sie Felder verarbeiten müssen, um Ihre Ausgabe nicht zu formatieren.

Für eine vorhersehbare Ausgabe folgen Sie der Empfehlung POSIX.1 und verwenden Sie echo überhaupt nicht. Verwenden Sie stattdessen printf.

+1

Es ist legitim, 'IFS' zu verwenden, um die Ausgabe als Feldtrennzeichen mit Array-Elementen (' "$ {array [*]}") oder "$ *" 'zu formatieren, was aber nur innerhalb von Anführungszeichen wirksam wird . – cdarke

+2

@ghoti Vielen Dank. Ich glaube, Du hast recht. Ich habe auch versucht $ 'line1 \ tline2', die Ihre Erklärung verifiziert – nathan

+1

FYI, ich glaube, das ist offizielles Dokument. "Wenn eine Parametererweiterung innerhalb von Anführungszeichen auftritt: Die Erweiterung des Pfadnamens darf nicht an den Ergebnissen der Erweiterung durchgeführt werden. Die Feldaufteilung darf nicht mit den Ergebnissen der Erweiterung durchgeführt werden, mit Ausnahme von '@', siehe Spezielle Parameter . " – nathan

Verwandte Themen