Como armazenar corretamente um caractere de nova linha em uma variável de shell (POSIX)? [duplicado]

1

update tenta esclarecer mais, usando um exemplo, os seguintes comandos shell:

SHELLVARIABLE="1st line,
2nd line,
3rd line,
" 
printf '%s' "$SHELLVARIABLE"

gera esta saída:

1st line,<newline>2nd line,<newline>3rd line,<newline>

<newline> sendo o caractere 0x0a / \n ?

Formulação original de pergunta

Qual é a maneira correta (POSIX-confirm) de armazenar um caractere newline 0x0a (também conhecido por seu estilo de comen c escape \n ) em uma variável de shell.

Eu quero ter certeza de fazer o seguinte:

SHELLVARIABLE="
"

não é meramente trabalhar por acaso, mas é, de fato, o caminho correto.

Como o printf do POSIX é perfeitamente capaz de produzir um caractere de nova linha (por exemplo, printf '\n' , ou printf '%b' '$()12' ) Eu tentei pela primeira vez uma forma mais explícita (? ou correta?):

SHELLVARIABLE="$(printf '\n')"

embora seja uma abordagem tentadora, não funciona. Como de acordo com o padrão , a substituição de comando (ou seja, por meio de ' ' e %code% ) deve remover

sequences of one or more newlines at the end of the substitution.

Nota: Pedir para armazenar uma nova linha final em uma variável de shell é apenas abstrair o caso de uso mais geral (na verdade, eu busco resposta), que é como armazenar uma string na variável de shell POSIX que termina com o personagem newline .

    
por humanityANDpeace 08.09.2018 / 16:05

1 resposta

1

Usar uma nova linha em uma string entre aspas é bom.

Embora pessoalmente, eu a evitaria se você quisesse apenas a nova linha: Eu acho que parece estranho e há um pequeno risco de acertar espaços extras acidentalmente 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 retira as novas linhas trailing , mas apenas aquelas. A solução é certificar-se de que o caractere final é diferente de uma nova linha e, em seguida, remover esse caractere.

Ambos devem fornecer uma nova linha:

nl1='
'

nl2="$(printf '\nx')"
nl2="${nl2%x}"
    
por 08.09.2018 / 17:12