2012-05-14 12 views
11

Quiero crear algunas secuencias de comandos para rellenar algunas plantillas e insertarlas en la carpeta de mi proyecto. Quiero utilizar un script de shell para esto, y las plantillas son muy pequeñas, por lo que quiero incrustarlas en el script de shell. El problema es que echo parece ignorar los saltos de línea en mi cadena. O eso, o la cadena no contiene saltos de línea para empezar. He aquí un ejemplo:Cómo hacer eco de cadenas de múltiples líneas en un shell de Bourne

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

echo -e $MY_STRING 

Este salidas:

Hello, world! This Is A Multi lined String.

Asumo echo es el culpable aquí. ¿Cómo puedo hacer que reconozca los saltos de línea?

+0

Esto es en realidad una pregunta del shell Bourne (no específica de bash). ¿Te importaría editar el título en consecuencia? – Jens

+1

Jens: Sé valiente, puedes hacer estas ediciones tú mismo (como acabo de hacer). – tripleee

+0

@tripleee: Solo quería ser amable y no pisar los pies de nadie. Voy a ir por eso. – Jens

Respuesta

15

Necesita comillas dobles para la interpolación variable.

echo -e "$MY_STRING" 

Esto es un error demasiado común. Deberías acostumbrarte a citar siempre cadenas, a menos que necesites dividirlas en tokens separados por espacios en blanco o tener comodines expandidos.

Por lo tanto, para ser explícito, el shell normalizará los espacios en blanco cuando analice su línea de comando. Puede ver esto si escribe un simple programa C que imprime su matriz 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.' 

Por el contrario, la cita, toda la cadena está en argv[0], saltos de línea y todo.

Por lo que vale la pena, también considerar aquí los documentos (con cat, no echo):

cat <<"HERE" 
foo 
Bar 
HERE 

También puede interpolar una variable en un documento aquí.

cat <<HERE 
$MY_STRING 
HERE 

... aunque en este caso particular, no es lo que desea.

+0

Genial, pero ¿podría explicar por qué antes de marcar correctamente su respuesta? EDITAR: Oh, claro, lo entiendo ahora. Olvidé que Bash no pasa cadenas como otros lenguajes de script – Hubro

+0

Edición de avisos. Espero que esto ayude. – tripleee

12

echo es tan noventa. The new (POSIX) kid on the block is printf.

printf '%s\n' "$MY_STRING" 

Sin -e o SYSV vs BSD locura de eco y control total sobre lo que se imprime dónde y cómo de ancho, las secuencias de escape como en C. Todo el mundo tiene que iniciar el uso de printf y nunca mirar hacia atrás.

+1

+1, printf tiene muchos más formatos útiles – Rony

Cuestiones relacionadas