1

bash配列を生成するbashスクリプトを実行し、何らかの方法でこの配列をbash呼び出しスクリプトに返す必要があります。呼び出し元のスクリプトに返される結果の配列は、あらゆる点で元の配列と同一でなければなりません。特別に扱われる文字 (スペースなど) はありません。また、前者のコンテキストで他のスクリプトを実行する余裕がないため、スクリプトは個別のプロセスである必要があります。

これは、ハックなしでは bash 関数が配列を受け入れたり返したりできないため、難しくなっています。配列のエンコード/デコードは複雑で遅くなる可能性がありますが、これを行うための最も簡単な (最小限のコーディング) または最速 (実行速度) の方法は何ですか?

4

2 に答える 2

4

与えられた配列 -- 連想かどうか:

$ typeset -a array
$ array=({1..10})

シリアル化された配列は次のようになります。

$ typeset -p array
declare -a array='([0]="1" [1]="2" [2]="3" [3]="4" \
    [4]="5" [5]="6" [6]="7" [7]="8" [8]="9" [9]="10")'

これは、宣言された変数の正確な構築コマンドを提供するため、行き来するときと行くときの両方で機能しようとしています。typeset/declare -p name

結果は宣言自体を含む文字列であり、そこから配列を評価し直すことができます-- GNU bash バージョン 4.2.24 でテスト済み:

$ declaration=$(typeset -p array)
$ eval ${declaration}
于 2013-03-02T14:02:20.033 に答える
1

これをきれいに行うもう 1 つの方法は、NUL で区切られたストリームを使用することです。これには、bash 以外の言語やツールから読み取ることができるという利点があります。そのストリームを生成するには:

printf '%s\0' "${your_array[@]}"

...そして、それを読むには:

your_array=()
while IFS='' read -r -d '' entry; do
  your_array+=( "$entry" )
done

これには、 を使用する場合のように、データを生成するコードが信頼されている必要がないという利点もありますeval


連想配列または疎配列の場合、ペアを発行できます。

for key in "${!your_array[@]}"; do
  printf '%s\0' "$key" "${your_array[$key]}"
done

...そして、読み返しのために:

declare -A your_array # if associative
while IFS='' read -r -d '' key && IFS='' read -r -d '' value; do
  your_array["$key"]="$value"
done
于 2013-07-28T23:58:28.307 に答える