ksh中命令输出的数组赋值

时间:2013-04-19 19:43:22

标签: ksh

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

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

不过,格伦的解决方案也非常简洁。谢谢!

1 个答案:

答案 0 :(得分: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测试