BASH,将数组写入nl_012_ \ n delim字符串

BASH,将数组写入nl_012_ \ n delim字符串

在 Ubuntu 12.04LTS 下使用 BASH GNU bash,版本 4.2.25(1)-release (x86_64-pc-linux-gnu)

我在将数组内容写入由新行分隔的字符串时遇到问题。

我发现这个条目(如何将 bash 数组变量转换为以换行符分隔的字符串?),这让我充满希望,相信解决方案就在眼前。这在命令行上完美运行。

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

但是,当我将它逐字逐句地包含在库中的函数中时,它却完全按照我自己的数组所做的那样,并打印...

s1 s2 s3 s4 4 4

在命令行上通过管道传输到 od 确认使用分隔符 '\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

在函数内部,完全相同的语句插入空格作为分隔符 '\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

这让我很困惑。我怎样才能在函数中强制使用 '\n' 分隔符?

问题补充说明我使用过的解决方案。在命令行上,引号没有任何区别(这误导了我!);echo -e $var 或 echo -e "$var" 都会产生正确的输出,如下所示。

s1
s2
s3
s4 4 4

在脚本中,引号确实有区别!没有引号,分隔符是空格 (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

在脚本中,引号中的分隔符是换行符(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

感谢这次学习经历。能否简单解释一下为什么命令行和脚本的行为不同?

答案1

您需要引用该变量。否则,它将被脚本扩展并传递echos1 s2 s3 s4

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

相关内容