1

Working in BASH GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu) under Ubuntu 12.04LTS

I'm having an issue with writing the contents of an array into a string delimited by new lines.

I have found this entry (How do I convert a bash array variable to a string delimited with newlines?), which gave me great hope that the solution was to hand. This works on the command line perfectly.

$ System=('s1' 's2' 's3' 's4 4 4')
$ var=$( IFS=$'\n'; echo "${System[*]}" )
$ echo -e $var
s1
s2
s3
s4 4 4

But when I include it verbatim in a function within a library, however, it does exactly what my own array was doing, and prints ...

s1 s2 s3 s4 4 4

On the command line piping to od confirms the use of the delimiter '\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

From within the function the exact same statements insert a space as a delimiter '\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

This has me stumped. How can I force the use of the '\n' delimiter within the function?

ADDITION TO QUESTION to illustrate the solution offered, which I have used. On the command line the quotes make no difference (which mislead me!); either echo -e $var or echo -e "$var" yield the correct output as below.

s1
s2
s3
s4 4 4

Within the script, the quotes do make a difference! Without quotes the delimiter is space (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

Within the script, with quotes the delimiter is newline (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

Thanks for this learning experience & is there a simple explanation for why the command line and the script behave differently?

bobox
  • 13

1 Answers1

0

You need to quote the variable. Otherwise, it is expanded by the script and passed to echo as s1 s2 s3 s4:

System=('s1' 's2' 's3' 's4 4 4')
var=$( IFS=$'\n'; echo "${System[*]}" )
echo -e "$var"
terdon
  • 54,564