atualização tentativa de esclarecer mais, usando um exemplo, faz os seguintes comandos de shell:
SHELLVARIABLE="1st line,
2nd line,
3rd line,
"
printf '%s' "$SHELLVARIABLE"
gere esta saída:
1st line,<newline>2nd line,<newline>3rd line,<newline>
<newline>
sendo o personagem 0x0a
/ \n
?
Formulação da pergunta original
Qual é a maneira correta (confirmação POSIX) de armazenar um caractere de nova linha0x0a
(também conhecido por seu estilo commen c escap \n
) em uma variável de shell.
Eu quero ter certeza de que fazendo o seguinte:
SHELLVARIABLE="
"
é, não apenas trabalhar por acaso, mas sim o caminho correto.
Como o printf do POSIX é perfeitamente capaz de produzir um caractere de nova linha (ou seja printf '\n'
, ou printf '%b' '\0012'
), primeiro tentei uma forma mais explícita (? ou correta?):
SHELLVARIABLE="$(printf '\n')"
embora seja uma abordagem tentadora, não funciona. Conforme o padrão , a substituição de comandos (ou seja, via $()
e ` `
) deve remover
sequências de uma ou mais novas linhas no final da substituição.
Nota: Pedir para armazenar uma única nova linha final em uma variável shell é apenas abstrair o caso de uso mais geral (eu realmente procuro resposta) que é como armazenar uma string na variável shell POSIX que termina com o caractere de nova linha .
Usar uma nova linha em uma string entre aspas é bom.
Embora, pessoalmente, eu o evite se você quiser apenas a nova linha: acho que parece estranho e há um pequeno risco de acidentalmente atingir espaços extras no final da primeira linha (então você obteria, por exemplo
<space><newline>
, ). Mas isso sou só eu.A substituição de comandos de fato remove as novas linhas à direita , mas apenas essas. A solução alternativa é certificar-se de que o caractere final seja algo diferente de uma nova linha e, em seguida, retire esse caractere.
Ambos devem fornecer uma nova linha: