scripts script programas operaciones manejo ejemplos comandos cadenas aritmeticas bash lines indentation continuation

script - Líneas de continuación de Bash



script linux ejemplos (7)

¿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


Sin embargo, si tiene un código sangrado, no funciona tan bien:

echo "continuation / lines" >continuation lines

Pruebe con comillas simples y concatenando las cadenas:

echo ''continuation'' / ''lines'' >continuation lines

Nota: la concatenación incluye un espacio en blanco.


Aquí, los documentos con el terminador <<-HERE funcionan bien para cadenas de texto multilínea indentadas. Eliminará las pestañas iniciales del documento aquí.

cat <<-____HERE continuation lines ____HERE

Ver también http://ss64.com/bash/syntax-here.html

Si necesita preservar algunos, pero no todos, espacios en blanco iniciales, puede usar algo llke

sed ''s/^ //'' <<____HERE This has four leading spaces. Two of them will be removed by sed. ____HERE


Esto es lo que puede querer

$ echo "continuation"/ > "lines" continuation lines

Si esto crea dos argumentos para eco y usted solo quiere uno, entonces veamos la concatenación de cadenas. En bash, colocar dos cadenas una al lado de la otra se concatenan:

$ echo "continuation""lines" continuationlines

Entonces, una línea de continuación sin sangría es una forma de dividir una cadena:

$ echo "continuation"/ > "lines" continuationlines

Pero cuando se usa una sangría:

$ echo "continuation"/ > "lines" continuation lines

Obtiene dos argumentos porque esto ya no es una concatenación.

Si desea una sola cuerda que cruza líneas, mientras sangra pero no obtiene todos esos espacios, un enfoque que puede intentar es deshacerse de la línea de continuación y usar variables:

$ a="continuation" $ b="lines" $ echo $a$b continuationlines

Esto le permitirá tener un código limpiamente sangrado a expensas de variables adicionales. Si convierte las variables en locales, no debería ser tan malo.


Me encontré con una situación en la que tuve que enviar un mensaje largo como parte de un argumento de comando y tuve que cumplir con la limitación de longitud de línea. Los comandos se ven algo como esto:

somecommand --message="I am a long message" args

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 de nuevo, fui con el siguiente enfoque:

message=$( tr "/n" " " <<- END This is a long message END ) somecommand --message="$message" args

Esto tiene la ventaja de que $message se puede usar exactamente como la constante de cadena sin espacio en blanco adicional o saltos de línea.

Tenga en cuenta que las líneas de mensaje anteriores están precedidas por un carácter de tab , que el propio documento elimina (debido al uso de <<- ). Todavía hay saltos de línea al final, que luego se reemplazan por dd con espacios.

Tenga en cuenta también que si no elimina las nuevas líneas, aparecerán tal como están cuando se expande "$message" . En algunos casos, puede solucionar el problema eliminando las comillas dobles alrededor de $message , pero el mensaje ya no será un único argumento.


Probablemente esto no responda tu pregunta, pero de todos modos podrías encontrarlo útil.

El primer comando crea el script que se muestra con el segundo comando.

El tercer comando hace que el script sea ejecutable.

El cuarto comando proporciona un ejemplo de uso.

john@malkovich:~/tmp/so$ echo $''#!/usr/bin/env python/nimport textwrap, sys/n/ndef bash_dedent(text):/n """Dedent all but the first line in the passed `text`."""/n try:/n first, rest = text.split("//n", 1)/n return "//n".join([first, textwrap.dedent(rest)])/n except ValueError:/n return text # single-line string/n/nprint bash_dedent(sys.argv[1])'' > bash_dedent john@malkovich:~/tmp/so$ cat bash_dedent #!/usr/bin/env python import textwrap, sys def bash_dedent(text): """Dedent all but the first line in the passed `text`.""" try: first, rest = text.split("/n", 1) return "/n".join([first, textwrap.dedent(rest)]) except ValueError: return text # single-line string print bash_dedent(sys.argv[1]) john@malkovich:~/tmp/so$ chmod a+x bash_dedent john@malkovich:~/tmp/so$ echo "$(./bash_dedent "first line > second line > third line")" first line second line third line

Tenga en cuenta que si realmente desea utilizar este script, tiene más sentido mover el script ejecutable a ~/bin para que esté en su camino.

Consulte la referencia de python para obtener detalles sobre cómo funciona textwrap.dedent .

Si el uso de $''...'' o "$(...)" es confuso para usted, haga otra pregunta (una por construcción) si todavía no hay una. Sería bueno proporcionar un enlace a la pregunta que encuentre / solicite para que otras personas tengan una referencia vinculada.


Puedes usar arrays bash

$ str_array=("continuation" "lines")

entonces

$ echo "${str_array[*]}" continuation lines

hay un espacio extra, porque (después del manual bash):

Si la palabra tiene comillas dobles, ${name[*]} expande a una sola palabra con el valor de cada miembro de la matriz separado por el primer carácter de la variable IFS

Así que configure IFS='''' para deshacerse del espacio extra

$ IFS='''' $ echo "${str_array[*]}" continuationlines


Simplemente puede separarlo con líneas nuevas (sin usar barras diagonales inversas) como se requiere dentro de la sangría de la siguiente manera y simplemente pelar nuevas líneas.

Ejemplo:

echo "continuation of lines" | tr ''/n'' '' ''

O si se trata de una definición variable, newlines se convierte automáticamente en espacios. Por lo tanto, tira de espacios adicionales solo si corresponde.

x="continuation of multiple lines" y="red|blue| green|yellow" echo $x # This will do as the converted space actually is meaningful echo $y | tr -d '' '' # Stripping of space may be preferable in this case