La solución es usar $'string'
, por ejemplo:
$ STR=$'Hello\nWorld'
$ echo "$STR" # quotes are required here!
Hello
World
Aquí hay un extracto de la página del manual de Bash:
Words of the form $'string' are treated specially. The word expands to
string, with backslash-escaped characters replaced as specified by the
ANSI C standard. Backslash escape sequences, if present, are decoded
as follows:
\a alert (bell)
\b backspace
\e
\E an escape character
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
\\ backslash
\' single quote
\" double quote
\nnn the eight-bit character whose value is the octal value
nnn (one to three digits)
\xHH the eight-bit character whose value is the hexadecimal
value HH (one or two hex digits)
\cx a control-x character
The expanded result is single-quoted, as if the dollar sign had not
been present.
A double-quoted string preceded by a dollar sign ($"string") will cause
the string to be translated according to the current locale. If the
current locale is C or POSIX, the dollar sign is ignored. If the
string is translated and replaced, the replacement is double-quoted.
STR=$"Hello\nWorld"
simplemente imprimeHello\nWorld
.H="Hello"; W="World"; STR="${H}"$'\n'"${W}"; echo "${STR}"
repetirá "Hola" y "Mundo" en líneas separadasEcho es tan noventa y tan lleno de peligros que su uso debería dar como resultado volcados de núcleo no menos de 4 GB. En serio, los problemas de echo fueron la razón por la cual el proceso de estandarización de Unix finalmente inventó la
printf
utilidad, eliminando todos los problemas.Entonces, para obtener una nueva línea en una cadena:
¡Ahí! Sin SYSV vs BSD echo madness, todo se imprime perfectamente y es totalmente portátil para secuencias de escape C. Todos, por favor, usen
printf
ahora y nunca miren hacia atrás.fuente
$'string'
es aún más limpia.$'foo'
sintaxis no es válida sintaxis POSIX a partir de 2013. Muchos shells se quejarán.BAR=$(printf "hello\nworld\n")
no imprime el final \ n para mí$()
POSIX especifica que se eliminan las secuencias de uno o más caracteres <línea nueva> al final de la sustitución .Lo que hice en base a las otras respuestas fue
fuente
El problema no es con el shell. El problema es en realidad con el
echo
comando en sí y la falta de comillas dobles alrededor de la interpolación variable. Puede intentar usar,echo -e
pero eso no es compatible con todas las plataformas, y una de las razonesprintf
ahora se recomienda para la portabilidad.También puede intentar insertar la nueva línea directamente en su script de shell (si un script es lo que está escribiendo) para que se vea como ...
o equivalente
fuente
Encuentro la
-e
bandera elegante y directaSi la cadena es la salida de otro comando, solo uso comillas
fuente
echo
.echo -e
Es conocido por sus problemas de portabilidad. Esta es una situación menos salvaje ahora que antes de POSIX, pero todavía no hay razón para preferirecho -e
. Ver también stackoverflow.com/questions/11530203/…La única alternativa simple es escribir una nueva línea en la variable:
Sí, eso significa escribir Enterdonde sea necesario en el código.
Hay varios equivalentes a un
new line
personaje.Pero todos ellos requieren "una interpretación" de alguna herramienta ( POSIX printf ):
Y por lo tanto, la herramienta es necesaria para construir una cadena con una nueva línea:
En algunos shells, la secuencia $'es una expansión especial de shell. Se sabe que funciona en ksh93, bash y zsh:
Por supuesto, también son posibles soluciones más complejas:
O
fuente
Un $ justo antes de las comillas simples '... \ n ...' como sigue, sin embargo, las comillas dobles no funcionan.
fuente
No soy un experto en bash, pero este funcionó para mí:
Esto me resultó más fácil de formatear los textos.
fuente
$NEWSTR
enecho "$NEWSTR"
son importantes aquíEn mi sistema (Ubuntu 17.10) su ejemplo simplemente funciona como lo desea, tanto cuando se escribe desde la línea de comando (en
sh
) como cuando se ejecuta como unsh
script:Supongo que esto responde a tu pregunta: simplemente funciona. (No he tratado de descubrir detalles como en qué momento
\n
ocurre exactamente la sustitución del carácter de nueva líneash
).Sin embargo, me di cuenta de que esta misma secuencia de comandos se comportan de manera diferente cuando se ejecuta con
bash
y se imprimaHello\nWorld
en su lugar:Logré obtener el resultado deseado de la
bash
siguiente manera:Tenga en cuenta las comillas dobles alrededor
$STR
. Esto se comporta de manera idéntica si se guarda y ejecuta como unbash
script.Lo siguiente también da el resultado deseado:
fuente
Aquellos exigentes que solo necesitan la nueva línea y desprecian el código multilínea que rompe la sangría, podrían hacer:
Bash (y probablemente otros shells) engullen todas las nuevas líneas finales después de la sustitución del comando, por lo que debe finalizar la
printf
cadena con un carácter que no sea de nueva línea y eliminarla después. Esto también puede convertirse fácilmente en una línea.fuente
No estaba muy contento con ninguna de las opciones aquí. Esto es lo que funcionó para mí.
fuente
str=$(printf '%s\n' "first line" "another line" "and another line")
(el shell convenientemente (o no) recortará cualquier nueva línea final de la sustitución del comando). Varias respuestas aquí ya promuevenprintf
en varias formas, así que no estoy seguro de que esto agregue algún valor como una respuesta separada.printf '%s\n' "first line" \
(nueva línea, sangría),'second line'
etc. Consulte tambiénprintf -v str
para asignar a una variable sin generar una subshell.