Come dire a bash che la riga continua sulla riga successiva


101

In uno script bash ricevuto da un altro programmatore, alcune righe superavano le 80 colonne di lunghezza. Qual è il carattere o la cosa da aggiungere alla riga per indicare che la riga continua sulla riga successiva?


Vedere la discussione aggiuntiva su stackoverflow.com/questions/18599711/…
enharmonic

Risposte:


130

Il carattere è una barra rovesciata \

Dal manuale di bash :

Il carattere barra rovesciata "\" può essere utilizzato per rimuovere qualsiasi significato speciale per il carattere successivo letto e per la continuazione della riga.


Grazie. e qual è il solito limite nelle colonne di uno script bash?
Apri la strada

bash non ha limiti di colonna interessanti; per chiarezza dovresti provare a limitare a 70-80 caratteri per colonna.
Habbie

9
@RyanM La barra rovesciata deve essere l'ultimo carattere prima del carattere di fine riga. Sei SICURO di non avere spazi bianchi dopo \?
George

9
@George Yeah. Un po 'più di giocherellare sputa un errore con a ^M. Il problema sembra essere che lo script mi ​​è stato dato da qualcuno che usa Windows. Un rapido dos2unixrisolto :)
RyanM

2
@George il tuo commento mi ha appena salvato, avevo uno spazio dopo \ e non riuscivo a capire cosa c'era che non andava. Saluti!
ffledgling

37

In generale, è possibile utilizzare una barra rovesciata alla fine di una riga in modo che il comando continui alla riga successiva. Tuttavia, ci sono casi in cui i comandi vengono implicitamente continuati, vale a dire quando la riga termina con un token che non può terminare legalmente un comando. In tal caso, la shell sa che sta arrivando altro e il backslash può essere omesso. Qualche esempio:

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

# Pipes
$ echo foo |
> cat
foo

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

Diversa, ma correlata, è la continuazione implicita tra virgolette. In questo caso, senza una barra rovesciata, stai semplicemente aggiungendo una nuova riga alla stringa.

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

Con una barra rovesciata, dividi nuovamente la riga logica in più righe logiche.

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

Esiste un elenco formale di tali situazioni, in cui un comando viene continuato implicitamente nella riga successiva? Mi sembra che avrei potuto lasciare la barra rovesciata in determinate circostanze all'interno di un [[- ]]condizione, ma non in altri, e sto cercando di capire le regole.
Menachem

16

\fa il lavoro. La risposta di @ Guillaume e il commento di @ George rispondono chiaramente a questa domanda. Qui spiego perché The backslash has to be the very last character before the end of line character.Considera questo comando:

   mysql -uroot \
   -hlocalhost      

Se è presente uno spazio dopo \, la continuazione della riga non funzionerà. Il motivo è che \ rimuove il significato speciale per il carattere successivo che è uno spazio non il carattere di avanzamento riga invisibile. Il carattere di avanzamento riga è dopo lo spazio non \in questo esempio.


2
Grazie per aver sottolineato la parte "molto ultimo personaggio". Mi sentivo un po 'frustrato nel seguire esattamente questo bug.
Jason
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.