2012-05-14 5 views
11

Desidero creare alcuni script per riempire alcuni modelli e inserirli nella cartella del mio progetto. Voglio usare uno script di shell per questo, ei modelli sono molto piccoli quindi voglio incorporarli nello script della shell. Il problema è che echo sembra ignorare le interruzioni di riga nella mia stringa. O quello, o la stringa non contiene interruzioni di riga per cominciare. Ecco un esempio:Come eseguire il richiamo di stringhe multifase in una shell Bourne

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

echo -e $MY_STRING 

Questo uscite:

Hello, world! This Is A Multi lined String.

sto assumendo echo è il colpevole qui. Come posso convincerlo a riconoscere le interruzioni di riga?

+0

Questa è in realtà una domanda di shell Bourne (non specifica per bash). Ti dispiacerebbe modificare il titolo di conseguenza? – Jens

+1

Jens: Sii audace, puoi apportare queste modifiche da solo (come ho appena fatto). – tripleee

+0

@ triple: Volevo solo essere gentile e non calpestare nessuno. Ci andrò. – Jens

risposta

15

Sono necessarie doppie virgolette sull'interpolazione variabile.

echo -e "$MY_STRING" 

Questo è un errore fin troppo comune. Dovresti prendere l'abitudine di citare sempre le stringhe, a meno che tu non abbia specificamente bisogno di dividere in token separati da spazi vuoti o di espandere i caratteri jolly.

Quindi, per essere espliciti, la shell normalizzerà lo spazio bianco quando analizza la riga di comando. Puoi vedere questo se scrivi un semplice programma C che stampa la sua matrice 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.' 

Per contro, con cita, l'intera stringa è in argv[0], a capo e tutti.

Per quel che vale, in considerazione anche qui i documenti (con cat, non echo):

cat <<"HERE" 
foo 
Bar 
HERE 

È possibile anche interpolare una variabile in un documento qui.

cat <<HERE 
$MY_STRING 
HERE 

... anche se in questo caso particolare, non è certo quello che si vuole.

+0

Fantastico, ma potresti spiegarmi perché prima segnalo la tua risposta corretta? EDIT: Oh giusto ho capito ora. Ho dimenticato che Bash non passa le stringhe come gli altri linguaggi di script – Hubro

+0

Notifiche. Spero che questo ti aiuti. – tripleee

2

Prova questo:

echo "$MY_STRING" 
12

echo è così anni Novanta. The new (POSIX) kid on the block is printf.

printf '%s\n' "$MY_STRING" 

No -e o SYSV vs BSD eco follia e il pieno controllo su ciò che viene stampato dove e come ampia, sequenze di escape come in C. Ognuno prega di iniziare a utilizzare printf ora e mai guardare indietro.

+1

+1, printf ha molte più pratiche formattazioni – Rony

Problemi correlati