2012-05-14 7 views
11

Chcę utworzyć skrypty do wypełniania niektórych szablonów i wstawiania ich do mojego folderu projektu. Chcę użyć do tego skryptu powłoki, a szablony są bardzo małe, więc chcę je osadzić w skrypcie powłoki. Problem polega na tym, że echo wydaje się zignorować podziały wierszy w moim ciągu. Albo to, albo ciąg nie zawiera początkowych linii podziału. Oto przykład:Jak echo wieloliniowych ciągów w powłoce Bourne'a

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

echo -e $MY_STRING 

This wyjścia:

Hello, world! This Is A Multi lined String.

Jestem zakładając echo winowajcą jest tutaj. Jak mogę uzyskać potwierdzenie linii?

+0

To jest właściwie pytanie powłoki Bourne'a (nie specyficzne dla bash). Czy mógłbyś odpowiednio zmienić tytuł? – Jens

+1

Jens: Bądź odważny, możesz wprowadzić te zmiany samodzielnie (tak jak ja właśnie). – tripleee

+0

@tripleee: Chciałem być miły i nie stawać niczyjemu palec u nogi. Pójdę po to. – Jens

Odpowiedz

15

Potrzebne są podwójne cudzysłowy wokół interpolacji zmiennej.

echo -e "$MY_STRING" 

Jest to błąd zbyt powszechny. Powinieneś wejść w nawyk ciągłego cytowania ciągów, chyba że musisz rozdzielić na żetony rozdzielone białymi znakami lub rozwinąć symbole wieloznaczne.

Aby wyjaśnić, powłoka znormalizuje białe spacje podczas analizy linii poleceń. Możesz to zobaczyć, jeśli napiszesz prosty program C, który wypisze jego tablicę argv.

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

Natomiast przy cytowaniu, cały ciąg jest w argv[0], nowej linii i wszystkich.

Na co warto również rozważyć tutaj dokumenty (z cat nie echo):

cat <<"HERE" 
foo 
Bar 
HERE 

Można również interpolować zmienną w tutaj dokumencie.

cat <<HERE 
$MY_STRING 
HERE 

... chociaż w tym konkretnym przypadku nie jest to dokładnie to, czego potrzebujesz.

+0

Fajnie, ale czy mógłbyś wyjaśnić dlaczego zanim oznaczyłem twoją odpowiedź poprawnie? EDYCJA: Oh prawy, mam to teraz. Zapomniałem, że Bash nie przekazuje ciągów takich jak inne języki skryptowe. – Hubro

+0

Zawiadomienie o zmianach. Mam nadzieję że to pomoże. – tripleee

12

echo jest tak dziewięćdziesiątych. The new (POSIX) kid on the block is printf.

printf '%s\n' "$MY_STRING" 

Nie -e lub SYSV vs szaleństwa BSD echa i pełną kontrolę nad tym, co zostanie wydrukowane, gdzie i jak szeroki, sekwencje jak w C. Wszyscy prosimy rozpocząć korzystanie printf teraz i nigdy nie patrzeć wstecz.

+1

+1, printf ma wiele bardziej poręcznych formattings – Rony

Powiązane problemy