在 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
您需要引用该变量。否则,它将被脚本扩展并传递echo
给s1 s2 s3 s4
:
System=('s1' 's2' 's3' 's4 4 4')
var=$( IFS=$'\n'; echo "${System[*]}" )
echo -e "$var"