POSIXシェルスクリプトで擬似配列を使用するには?
Bashスクリプトで10個の整数配列を次に置き換えたいと思います。何POSIXシェルスクリプトに似ています。
偶然出会えたRichのsh(POSIXシェル)トリック、断面に配列の使用。
私が試したこと:
save_pseudo_array()
{
for i do
printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/"
done
echo " "
}
coords=$(save_pseudo_array "$@")
set -- 1895 955 1104 691 1131 660 1145 570 1199 381
eval "set -- $coords"
わかりません。それが問題なのですが、誰かを説明していただきありがとうございます。
ベストアンサー1
基本的なアイデアは、set
配列内のインデックス値を扱う経験を再現することです。したがって、配列で作業するには、set
次の値を使用してください。
set -- 1895 955 1104 691 1131 660 1145 570 1199 381
$1
その後、$2
などを使用してfor
与えられた値を処理できます。
複数の配列が必要な場合、これはあまり役に立ちません。これがsave
トリックeval
が入るところです。リッチsave
機能1現在の位置引数を処理し、適切な参照を含む文字列を出力します。その後、保存eval
された値を復元するために使用できます。だからあなたは逃げる
coords=$(save "$@")
現在作業している配列を保存してcoords
新しい配列を作成して使用し、再利用する必要がある場合は次のことcoords
ができますeval
。
eval "set -- $coords"
coords
この例を理解するには、2つの配列、つまり保存したい以前に設定された値を持つ配列と1895、955などを含む配列で作業していることを考慮する必要があります。コードスニペット自体はそれほど重要ではありません。それ自体では、行間set
でeval
いくつかの処理を実行する必要があります。後で1895、955のアレイを返す必要がある場合は、復元する前にアレイを保存してくださいcoords
。
newarray=$(save "$@")
eval "set -- $coords"
これにより、$newarray
後で復元できます。
1 は次のように定義されます。
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}