我想将命令的输出分配给数组,但遇到了以下问题:
temp=`<some_command>`
eval set -A array $temp
print $temp
print "***${array[0]},${array[1]}***"
该命令的输出类似于:
""
"D"
"M"
"N"
在我的预期中,${array[0]}
应该是""
,并且${array[1]}
应该是“D”。
但是,结果如下:
" "D" "M" "N" # $temp
*** D M N,*** # ${array[0]},${array[1]}
只是无法弄清楚数组的第一个元素如何扫描所有输出。以及如何解决?
更新:今天又看了一下脚本,发现命令的输出是:
" "
"D"
"M"
"N"
请注意第一行是" "
(其中有一个空格字符),而不是纯空字符串""
。
首先,原始输出是:
<some_command> |sort |uniq -c
6421 " "
1090 "D"
1 "DPV_VALID"
3 "M"
588 "N"
16 "S"
6382 "Y"
我一直以为第一行是一个纯空字符串,例如""
,没有意识到双引号中有空格字符。
然后,我曾经awk
得到第二个字段:
<some_command> |sort |uniq -c |awk '{print $2}'
输出变为:
"
"D"
"M"
"N"
这就是后来命令混乱的原因eval set -A
(awk
默认使用空格字符作为分隔符)。如果它是一个纯空字符串,它会起作用。
如果我将命令重写为:
temp=`<some_command> |sort |uniq -c |sed 's/" "$/""/' |awk '{print $2}'`
eval set -A array $temp
尽管如此,格伦的解决方案也非常简洁。谢谢!