Como dizer ao bash que a linha continua na próxima linha

98

Em um script bash que recebi de outro programador, algumas linhas ultrapassavam 80 colunas de comprimento. Qual é o caractere ou coisa a ser adicionada à linha para indicar que a linha continua na próxima linha?

Abra o caminho
fonte
Veja a discussão adicional em stackoverflow.com/questions/18599711/…
enarmônico

Respostas:

127

O personagem é uma barra invertida \

Do manual do bash :

O caractere de barra invertida '\' pode ser usado para remover qualquer significado especial para o próximo caractere lido e para a continuação da linha.

Guillaume
fonte
obrigado. e qual é o limite usual em colunas de um script bash?
Abra o caminho
bash não tem limite de coluna interessante; para maior clareza, você deve tentar limitar a 70-80 caracteres por coluna.
Habbie,
9
@RyanM A barra invertida deve ser o último caractere antes do caractere de fim de linha. Tem CERTEZA de que não há nenhum espaço em branco após o \?
George,
9
@George Sim. Um pouco mais de manipulação cuspir um erro com a ^M. O problema parece ser que o script foi dado a mim por alguém que usa o Windows. Um rápido dos2unixconsertou :)
RyanM
2
@George, seu comentário acabou de me salvar, eu tinha um espaço após o \ e não consegui descobrir o que estava errado. Felicidades!
ffledgling
36

Em geral, você pode usar uma barra invertida no final de uma linha para que o comando continue para a próxima linha. No entanto, há casos em que os comandos são continuados implicitamente, nomeadamente quando a linha termina com um token que não pode terminar legalmente um comando. Nesse caso, o shell sabe que mais está por vir, e a barra invertida pode ser omitida. Alguns exemplos:

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

# Pipes
$ echo foo |
> cat
foo

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

Diferente, mas relacionado, é a continuação implícita entre aspas. Nesse caso, sem uma barra invertida, você está simplesmente adicionando uma nova linha à string.

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

Com uma barra invertida, você está novamente dividindo a linha lógica em várias linhas lógicas.

$ x="foo\
> bar"
$ echo "$x"
foobar
chepner
fonte
Existe uma lista formal de tais situações, onde um comando é implicitamente continuado na próxima linha? Parece-me que eu poderia deixar a barra invertida em certas circunstâncias dentro de uma condição [[- ]], mas não em outras, e estou tentando descobrir as regras.
Menachem
16

\faz o trabalho. A resposta de @ Guillaume e o comentário de @George respondem claramente a esta pergunta. Aqui eu explico por que The backslash has to be the very last character before the end of line character.Considere este comando:

   mysql -uroot \
   -hlocalhost      

Se houver um espaço depois \, a continuação da linha não funcionará. A razão é que \ remove o significado especial para o próximo caractere, que é um espaço e não o caractere invisível de avanço de linha. O caractere de avanço de linha está após o espaço, não \neste exemplo.

Jingguo Yao
fonte
2
Obrigado por apontar a parte do "último personagem". Eu estava ficando um pouco frustrado rastreando exatamente esse bug.
Jason