2012-05-14 4 views
11

Ich möchte einige Skripts zum Ausfüllen einiger Vorlagen erstellen und sie in meinem Projektordner einfügen. Ich möchte dafür ein Shell-Skript verwenden, und die Vorlagen sind sehr klein, also möchte ich sie in das Shell-Skript einbetten. Das Problem ist, dass echo scheint die Zeilenumbrüche in meiner Zeichenfolge zu ignorieren. Entweder das, oder die Zeichenfolge enthält keine Zeilenumbrüche. Hier ein Beispiel:Wie Echo mehrzeilige Strings in einer Bourne-Shell

MY_STRING=" 
Hello, world! This 
Is 
A 
Multi lined 
String." 

echo -e $MY_STRING 

Diese Ausgänge:

Hello, world! This Is A Multi lined String.

ich echo gehe davon ist der Schuldige hier. Wie kann ich die Zeilenumbrüche bestätigen?

+0

Dies ist eigentlich eine Bourne-Shell-Frage (nicht Bash-spezifische). Würde es Ihnen etwas ausmachen, den Titel entsprechend zu bearbeiten? – Jens

+1

Jens: Sei mutig, du kannst diese Änderungen selbst machen (wie ich es gerade getan habe). – tripleee

+0

@tripleee: Ich wollte nur nett sein und nicht auf irgendjemandes Fuß treten. Ich werde es tun. – Jens

Antwort

15

Sie benötigen doppelte Anführungszeichen um die variable Interpolation.

echo -e "$MY_STRING" 

Dies ist ein allzu häufiger Fehler. Sie sollten sich die Angewohnheit zunutze machen, immer Strings zu zitieren, es sei denn, Sie müssen sich explizit in whitespace-separierte Tokens aufteilen oder Wildcards expandieren lassen.

Um explizit zu sein, normalisiert die Shell Whitespace, wenn sie Ihre Befehlszeile analysiert. Sie können dies sehen, wenn Sie ein einfaches C-Programm schreiben, das sein argv Array ausgibt.

argv[0]='Hello,' 
argv[1]='world!' 
argv[2]='This' 
argv[3]='Is' 
argv[4]='A' 
argv[5]='Multi' 
argv[6]='lined' 
argv[7]='String.' 

dagegen mit der Quotierung ist die ganze Reihe in argv[0], Zeilenumbrüche und alle.

Für das, was es wert ist, auch hier Dokumente betrachten (mit cat, nicht echo):

cat <<"HERE" 
foo 
Bar 
HERE 

Sie auch eine Variable in einem hier Dokument einfügen können.

cat <<HERE 
$MY_STRING 
HERE 

... obwohl in diesem speziellen Fall ist es kaum, was Sie wollen.

+0

Cool, aber könnten Sie erklären, warum, bevor ich Ihre Antwort richtig markieren? EDIT: Oh, ich verstehe es jetzt. Ich habe vergessen, dass Bash keine Zeichenfolgen wie andere Skriptsprachen übergibt – Hubro

+0

Beachten Sie Änderungen. Hoffe das hilft. – tripleee

12

echo so neunziger Jahre ist. The new (POSIX) kid on the block is printf.

printf '%s\n' "$MY_STRING" 

Kein -e oder SYSV vs BSD echo Wahnsinn und die volle Kontrolle über das, was gedruckt wird, wo und wie breit, wie alle in C. Escape-Sequenzen starten Sie printf jetzt mit und nie wieder sehen.

+1

+1, printf hat viel mehr praktische Formatierungen – Rony