POSIXシェルスクリプトで擬似配列を使用するには?

POSIXシェルスクリプトで擬似配列を使用するには?

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などを含む配列で作業していることを考慮する必要があります。コードスニペット自体はそれほど重要ではありません。それ自体では、行間setevalいくつかの処理を実行する必要があります。後で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 " "
}

おすすめ記事