Você precisa citar a variável. Caso contrário, ele é expandido pelo script e passado para echo
as s1 s2 s3 s4
:
System=('s1' 's2' 's3' 's4 4 4')
var=$( IFS=$'\n'; echo "${System[*]}" )
echo -e "$var"
Trabalhando no Bash GNU bash, versão 4.2.25 (1) -release (x86_64-pc-linux-gnu) no Ubuntu 12.04LTS
Estou com um problema ao escrever o conteúdo de uma matriz em uma string delimitada por novas linhas.
Eu encontrei esta entrada ( Como faço para converter uma variável de matriz bash para uma string delimitada por novas linhas? ), o que me deu grande esperança de que a solução fosse entregue. Isso funciona perfeitamente na linha de comando.
$ System=('s1' 's2' 's3' 's4 4 4')
$ var=$( IFS=$'\n'; echo "${System[*]}" )
$ echo -e $var
s1
s2
s3
s4 4 4
Mas quando eu o incluo textualmente em uma função dentro de uma biblioteca, no entanto, ele faz exatamente o que meu próprio array estava fazendo, e imprime ...
s1 s2 s3 s4 4 4
Na linha de comando, piping to od confirma o uso do delimitador '\ n'
$ echo -e $var | od -ab
0000000 s 1 nl s 2 nl s 3 nl s 4 sp 4 sp 4 nl
163 061 012 163 062 012 163 063 012 163 064 040 064 040 064 012
s 1 \n s 2 \n s 3 \n s 4 4 4 \n
0000020
Dentro da função, as mesmas instruções exatas inserem um espaço como um delimitador '\ s'
0000000 s 1 sp s 2 sp s 3 sp s 4 sp 4 sp 4 nl
163 061 040 163 062 040 163 063 040 163 064 040 064 040 064 012
s 1 s 2 s 3 s 4 4 4 \n
0000020
Isso me deixa perplexo. Como posso forçar o uso do delimitador '\ n' dentro da função?
ADIÇÃO À PERGUNTA para ilustrar a solução oferecida, que usei. Na linha de comando, as citações não fazem diferença (o que me engana!); Ou echo -e $ var ou echo -e "$ var" produz a saída correta como abaixo.
s1
s2
s3
s4 4 4
Dentro do roteiro, as citações fazem a diferença! Sem aspas o delimitador é espaço (sp / 040)
echo -e $var | od -abc
0000000 s 1 sp s 2 sp s 3 sp s 4 sp 4 sp 4 nl
163 061 040 163 062 040 163 063 040 163 064 040 064 040 064 012
s 1 s 2 s 3 s 4 4 4 \n
0000020
Dentro do script, com aspas o delimitador é nova linha (nl, 012, \ n).
echo -e "$var" | od -abc
0000000 s 1 nl s 2 nl s 3 nl s 4 sp 4 sp 4 nl
163 061 012 163 062 012 163 063 012 163 064 040 064 040 064 012
s 1 \n s 2 \n s 3 \n s 4 4 4 \n
0000020
Obrigado por esta experiência de aprendizagem & Existe uma explicação simples para o fato de a linha de comando e o script se comportarem de maneira diferente?
Tags bash