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?
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.
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.
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.
Respostas:
O personagem é uma barra invertida
\
Do manual do bash :
fonte
^M
. O problema parece ser que o script foi dado a mim por alguém que usa o Windows. Um rápidodos2unix
consertou :)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:
Diferente, mas relacionado, é a continuação implícita entre aspas. Nesse caso, sem uma barra invertida, você está simplesmente adicionando uma nova linha à string.
Com uma barra invertida, você está novamente dividindo a linha lógica em várias linhas lógicas.
fonte
[[
-]]
, mas não em outras, e estou tentando descobrir as regras.\
faz o trabalho. A resposta de @ Guillaume e o comentário de @George respondem claramente a esta pergunta. Aqui eu explico por queThe backslash has to be the very last character before the end of line character.
Considere este comando: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.fonte