Como anexar dados a uma variável usando \ n como separador?

2

Os novos caracteres de linha parecem estar perdidos, mesmo que apareçam entre aspas.

foo=
for i in 1 2 3; do
    foo="$foo$(printf '\n')$i"
done

echo "$foo"
123

Agora, na prática, eu não quero adicionar um \n antes do primeiro elemento, então eu usaria um ${foo:+$(printf '\n')} , mas primeiro eu tenho que descobrir porque o código acima não funciona. / p>     

por Ernest A 26.01.2016 / 18:15

2 respostas

5

A substituição de comandos remove novas linhas finais, por isso $(printf '\n') é a mesma coisa que $(printf '\n\n\n\n') , ou seja, a string vazia.

Para incluir uma nova linha em uma string, coloque-a entre aspas simples ou duplas.

for i in 1 2 3; do
  foo="$foo
$i"
done

Você pode achar menos feio definir uma variável para armazenar apenas uma nova linha.

nl='
'
for i in 1 2 3; do
  foo="$foo$nl$i"
done

No ksh93, bash, FreeBSD sh, mksh e zsh, mas não sh simples (ainda), você também pode usar aspas simples, o que permite escapes de barra invertida.

for i in 1 2 3; do
  foo="$foo"$'\n'"$i"
done
    
por 27.01.2016 / 01:03
6

Sim, os caracteres de nova linha foram perdidos, Substituição de Comando ate eles:

The shell shall expand the command substitution by executing command in a subshell environment (see Shell Execution Environment) and replacing the command substitution (the text of command plus the enclosing "$()" or backquotes) with the standard output of the command, removing sequences of one or more < newline > characters at the end of the substitution

Você não precisa do loop for , apenas:

foo=$(printf '%s\n' 1 2 3)
    
por 26.01.2016 / 18:21

Tags