0

我想将命令的输出分配给数组,但遇到了以下问题:

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 -Aawk默认使用空格字符作为分隔符)。如果它是一个纯空字符串,它会起作用。

如果我将命令重写为:

temp=`<some_command> |sort |uniq -c |sed 's/" "$/""/' |awk '{print $2}'`
eval set -A array $temp

尽管如此,格伦的解决方案也非常简洁。谢谢!

4

1 回答 1

2

如果要删除引号,只需删除它们。你不必求助于eval

temp='""
"D"
"M"
"N"'
set -A array $temp
for (( i=0; i<${#array[@]}; i++ )); do
    echo "$i:${array[i]}"
done
for (( i=0; i<${#array[@]}; i++ )); do
    array[i]=${array[i]#\"}   # remove a leading quote
    array[i]=${array[i]%\"}   # remove a trailing quote
done
for (( i=0; i<${#array[@]}; i++ )); do
    echo "$i:${array[i]}"
done

输出

0:""
1:"D"
2:"M"
3:"N"
0:   
1:D
2:M
3:N

用 ksh93 测试

于 2013-04-20T15:54:09.727 回答