我想将命令的输出分配给数组,但遇到了以下问题:
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
不过,格伦的解决方案也非常简洁。谢谢!
答案 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测试