¿Cómo se usan las líneas de continuación de bash?
Me doy cuenta de que puedes hacer esto:
echo "continuation \
lines"
>continuation lines
Sin embargo, si tiene un código sangrado, no funciona tan bien:
echo "continuation \
lines"
>continuation lines
bash
line
indentation
PyRulez
fuente
fuente
Respuestas:
Esto es lo que puedes desear
Si esto crea dos argumentos para hacer eco y solo desea uno, entonces veamos la concatenación de cadenas. En bash, colocando dos cadenas una al lado de la otra concatenadas:
Entonces, una línea de continuación sin sangría es una forma de dividir una cadena:
Pero cuando se usa una sangría:
Obtienes dos argumentos porque esto ya no es una concatenación.
Si desea una sola cadena que cruza líneas, al aplicar sangría pero no obtener todos esos espacios, un enfoque que puede intentar es deshacerse de la línea de continuación y usar variables:
Esto le permitirá tener un código con sangría limpia a expensas de variables adicionales. Si hace que las variables sean locales, no debería ser tan malo.
fuente
s="string no. 1" s+="string no. 2" s+=" string no. 3" echo "$s"
Aquí los documentos con el
<<-HERE
terminador funcionan bien para cadenas de texto de varias líneas sangradas. Eliminará todas las pestañas iniciales del documento aquí. (Sin embargo, los terminadores de línea permanecerán).Ver también http://ss64.com/bash/syntax-here.html
Si necesita preservar algunos, pero no todos, espacios en blanco, puede usar algo como
o tal vez lo use
tr
para deshacerse de las nuevas líneas:(La segunda línea tiene una pestaña y un espacio al frente; el operador del tablero eliminará la pestaña antes del terminador heredoc, mientras que el espacio se conservará).
Para envolver cadenas largas y complejas en muchas líneas, me gusta
printf
:También funciona bien en contextos donde desea incrustar piezas de script de shell no triviales en otro idioma donde la sintaxis del idioma del host no le permitirá usar un documento aquí, como en un
Makefile
oDockerfile
.fuente
printf
ejemplo también ahora.)Puedes usar matrices bash
luego
hay un espacio extra, porque (después del manual bash):
Así que prepárate
IFS=''
para deshacerte del espacio extrafuente
En ciertos escenarios, utilizar la capacidad de concatenación de Bash podría ser apropiado.
Ejemplo:
Desde la sección PARÁMETROS de la página Bash Man:
fuente
Encontré una situación en la que tenía que enviar un mensaje largo como parte de un argumento de comando y tenía que cumplir con la limitación de longitud de línea. Los comandos se parecen a esto:
La forma en que resolví esto es mover el mensaje como un documento aquí (como sugirió @tripleee). Pero un documento aquí se convierte en un stdin, por lo que debe leerse nuevamente, seguí el siguiente enfoque:
Esto tiene la ventaja de que
$message
puede usarse exactamente como la constante de cadena sin espacios en blanco o saltos de línea adicionales.Tenga en cuenta que las líneas de mensaje reales anteriores tienen el prefijo de un
tab
carácter cada una, que se elimina aquí mismo documento (debido al uso de<<-
). Todavía hay saltos de línea al final, que luego se reemplazan pordd
espacios.Tenga en cuenta también que si no elimina las nuevas líneas, aparecerán tal como están cuando
"$message"
se expanden. En algunos casos, es posible que pueda solucionarlo eliminando las comillas dobles$message
, pero el mensaje ya no será un argumento único.fuente
Las continuaciones de línea también se pueden lograr mediante el uso inteligente de la sintaxis.
En el caso de
echo
:En el caso de vars:
Otro enfoque en el caso de vars:
Voila!
fuente
Simplemente puede separarlo con nuevas líneas (sin usar la barra invertida) según se requiera dentro de la sangría de la siguiente manera y solo una tira de nuevas líneas.
Ejemplo:
O si se trata de una definición variable, las nuevas líneas se convierten automáticamente en espacios. Por lo tanto, tira de espacios adicionales solo si corresponde.
fuente
Esto no es exactamente lo que pidió el usuario, pero otra forma de crear una cadena larga que abarca varias líneas es acumulándola gradualmente, de esta manera:
Obviamente en este caso hubiera sido más sencillo construirlo de una vez, pero este estilo puede ser muy ligero y comprensible cuando se trata de cuerdas más largas.
fuente
Pruebe con comillas simples y concatenando las cadenas:
Nota: la concatenación incluye un espacio en blanco.
fuente
echo
si teníax=
, se obtendría el error:lines: command not found
.Dependiendo de qué tipo de riesgos aceptará y qué tan bien conoce y confía en los datos, puede utilizar la interpolación de variables simplista.
fuente
Probablemente, esto realmente no responda a su pregunta, pero de todos modos puede resultarle útil.
El primer comando crea el script que muestra el segundo comando.
El tercer comando hace que ese script sea ejecutable.
El cuarto comando proporciona un ejemplo de uso.
Tenga en cuenta que si realmente desea usar este script, tiene más sentido mover el script ejecutable
~/bin
para que esté en su camino.Consulte la referencia de Python para obtener detalles sobre cómo
textwrap.dedent
funciona.Si el uso de
$'...'
o"$(...)"
es confuso para usted, haga otra pregunta (una por construcción) si todavía no hay una. Puede ser bueno proporcionar un enlace a la pregunta que encuentre / haga para que otras personas tengan una referencia vinculada.fuente