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"

最初の行は純粋な空の文字列だといつも思っていました。たとえば""、二重引用符にスペース文字があることに気づきませんでした。

次に、awk2番目のフィールドを取得していました:

<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

それでも、グレンのソリューションもかなりきれいです。ありがとう!

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 に答える