Cómo decirle a bash que la línea continúa en la siguiente línea

98

En un script bash que obtuve de otro programador, algunas líneas excedían las 80 columnas de longitud. ¿Cuál es el carácter o cosa que se agregará a la línea para indicar que la línea continúa en la línea siguiente?

Abre el camino
fuente
Vea una discusión adicional en stackoverflow.com/questions/18599711/…
enharmonic

Respuestas:

127

El personaje es una barra invertida \

Desde el manual de bash :

El carácter de barra invertida '\' puede usarse para eliminar cualquier significado especial para el siguiente carácter leído y para la continuación de línea.

Guillaume
fuente
Gracias. y ¿cuál es el límite habitual en las columnas de un script bash?
Abre el camino
bash no tiene un límite de columna interesante; para mayor claridad, debe intentar limitar a 70-80 caracteres por columna.
Habbie
9
@RyanM La barra invertida debe ser el último carácter antes del carácter de final de línea. ¿Está SEGURO de que no tiene ningún espacio en blanco después de \?
George
9
@George Sí. Un poco más de violín escupe un error con un ^M. El problema parece ser que el script me lo dio alguien que usa Windows. Un dos2unix
arreglo
2
@George, tu comentario me acaba de salvar, tenía un espacio después del \ y no podía averiguar qué estaba mal. ¡Salud!
incipiente
36

En general, puede usar una barra invertida al final de una línea para que el comando continúe en la siguiente línea. Sin embargo, hay casos en los que los comandos continúan implícitamente, es decir, cuando la línea termina con un token que no puede terminar legalmente un comando. En ese caso, el shell sabe que se avecinan más y se puede omitir la barra invertida. Algunos ejemplos:

# In general
$ echo "foo" \
> "bar"
foo bar

# Pipes
$ echo foo |
> cat
foo

# && and ||
$ echo foo &&
> echo bar
foo
bar
$ false ||
> echo bar
bar

Diferente, pero relacionada, es la continuación implícita entre comillas. En este caso, sin una barra invertida, simplemente está agregando una nueva línea a la cadena.

$ x="foo
> bar"
$ echo "$x"
foo
bar

Con una barra invertida, vuelve a dividir la línea lógica en varias líneas lógicas.

$ x="foo\
> bar"
$ echo "$x"
foobar
chepner
fuente
¿Existe una lista formal de tales situaciones, en las que un comando se continúa implícitamente en la siguiente línea? Me parece que podía dejar la barra invertida en determinadas circunstancias dentro de una [[- ]]condición, pero no en otros, y estoy tratando de averiguar las reglas.
Menachem
16

\hace el trabajo. La respuesta de @ Guillaume y el comentario de @ George responden claramente a esta pregunta. Aquí te explico por qué The backslash has to be the very last character before the end of line character.considera este comando:

   mysql -uroot \
   -hlocalhost      

Si hay un espacio después \, la continuación de la línea no funcionará. La razón es que \ elimina el significado especial para el siguiente carácter, que es un espacio, no el carácter de avance de línea invisible. El carácter de avance de línea está después del espacio, no \en este ejemplo.

Jingguo Yao
fuente
2
Gracias por señalar la parte del "último personaje". Me estaba frustrando un poco rastrear exactamente este error.
Jason