BASH, escrevendo array para nl_012_ \ n delim uma string

1

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?

    
por bobox 19.02.2014 / 20:27

1 resposta

0

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"
    
por 19.02.2014 / 21:28

Tags