Como você usa linhas de continuação do bash?
Sei que você pode fazer isso:
echo "continuation \
lines"
>continuation lines
No entanto, se você tiver um recuo do código, ele não funcionará tão bem:
echo "continuation \
lines"
>continuation lines
bash
line
indentation
PyRulez
fonte
fonte
Respostas:
Isto é o que você pode querer
Se isso cria dois argumentos para ecoar e você deseja apenas um, vamos dar uma olhada na concatenação de strings. No bash, a colocação de duas cadeias uma ao lado da outra concatena:
Portanto, uma linha de continuação sem recuo é uma maneira de quebrar uma string:
Mas quando um recuo é usado:
Você recebe dois argumentos porque isso não é mais uma concatenação.
Se você deseja uma única string que cruza as linhas, enquanto recua, mas não obtém todos esses espaços, uma abordagem que você pode tentar é abandonar a linha de continuação e usar variáveis:
Isso permitirá que você tenha um código recuado de maneira limpa à custa de variáveis adicionais. Se você tornar as variáveis locais, não deve ser tão ruim.
fonte
s="string no. 1" s+="string no. 2" s+=" string no. 3" echo "$s"
Aqui, os documentos com o
<<-HERE
terminador funcionam bem para cadeias de texto de múltiplas linhas recuadas. Ele removerá todas as guias principais do documento aqui. (Os terminadores de linha ainda permanecerão.)Consulte também http://ss64.com/bash/syntax-here.html
Se você precisar preservar alguns, mas não todos, espaços em branco à esquerda, use algo como
ou talvez use
tr
para se livrar das novas linhas:(A segunda linha tem uma aba e um espaço na frente; a aba será removida pelo operador do traço antes do terminador heredoc, enquanto o espaço será preservado.)
Para agrupar seqüências longas e complexas em várias linhas, eu gosto de
printf
:Também funciona bem em contextos em que você deseja incorporar partes não triviais do shell script em outro idioma em que a sintaxe do idioma host não permita que você use um documento aqui, como em um
Makefile
ouDockerfile
.fonte
printf
exemplo também agora.)Você pode usar matrizes bash
então
existe um espaço extra, porque (após o manual do bash):
Então
IFS=''
prepare-se para se livrar do espaço extrafonte
Em certos cenários, a utilização da capacidade de concatenação do Bash pode ser apropriada.
Exemplo:
Na seção PARÂMETROS da página do Bash Man:
fonte
Me deparei com uma situação em que eu tinha que enviar uma mensagem longa como parte de um argumento de comando e tinha que aderir à limitação do comprimento da linha. Os comandos são mais ou menos assim:
A maneira que resolvi isso é mover a mensagem como um documento aqui (como o @tripleee sugeriu). Mas um documento aqui se torna um stdin, portanto, ele precisa ser lido novamente. Fiz a seguinte abordagem:
Isso tem a vantagem de
$message
poder ser usado exatamente como a constante da string, sem espaços em branco ou quebras de linha extras.Observe que as linhas de mensagem reais acima são prefixadas com um
tab
caractere cada, que é excluído pelo próprio documento aqui (devido ao uso de<<-
). Ainda existem quebras de linha no final, que são substituídas pordd
espaços.Observe também que, se você não remover novas linhas, elas aparecerão como estão quando
"$message"
forem expandidas. Em alguns casos, você pode solucionar o problema removendo as aspas duplas$message
, mas a mensagem não será mais um argumento único.fonte
As continuações de linha também podem ser obtidas através do uso inteligente da sintaxe.
No caso de
echo
:No caso de vars:
Outra abordagem no caso de vars:
Voila!
fonte
Você pode simplesmente separá-lo com novas linhas (sem usar barra invertida) conforme necessário dentro do recuo da seguinte forma e apenas retirar novas linhas.
Exemplo:
Ou, se for uma definição variável, as novas linhas são convertidas automaticamente em espaços. Portanto, retire os espaços extras somente se aplicável.
fonte
Isso não é exatamente o que o usuário pediu, mas outra maneira de criar uma cadeia longa que abrange várias linhas é construindo-a de forma incremental, da seguinte forma:
Obviamente, nesse caso, teria sido mais simples construí-lo de uma só vez, mas esse estilo pode ser muito leve e compreensível ao lidar com cordas mais longas.
fonte
Tente com aspas simples e concatenar as strings:
Nota: a concatenação inclui um espaço em branco.
fonte
echo
se você tivessex=
, você iria obter o erro:lines: command not found
.Dependendo do tipo de risco que você aceitará e de quanto conhece e confia nos dados, é possível usar a interpolação simplista de variáveis.
fonte
Provavelmente, isso realmente não responde à sua pergunta, mas você pode achar útil de qualquer maneira.
O primeiro comando cria o script que é exibido pelo segundo comando.
O terceiro comando torna esse script executável.
O quarto comando fornece um exemplo de uso.
Observe que, se você realmente deseja usar esse script, faz mais sentido mover o script executável
~/bin
para que ele fique no seu caminho.Verifique a referência do python para obter detalhes sobre como
textwrap.dedent
funciona.Se o uso de
$'...'
ou"$(...)"
for confuso para você, faça outra pergunta (uma por construção), se ainda não houver uma. Pode ser bom fornecer um link para a pergunta que você encontra / faz, para que outras pessoas tenham uma referência vinculada.fonte