スペースを含む文字列でbash配列を入力し、次の配列から項目を読み込みます。

スペースを含む文字列でbash配列を入力し、次の配列から項目を読み込みます。

各項目に空白のある Bash 配列を埋める方法を議論するいくつかの記事を読んだ。私は成功したと信じています。

私がしなければならないことは、ループ内でこれを実行して、各反復のすべての配列の内容でより大きな配列を埋めることです。

そのため、別のスクリプトから取得した配列項目を繰り返す外部ループがあります。このループを繰り返すたびに、複数行の出力を生成するコマンドラインを実行し、各行が配列項目になるようにします。これらの配列エントリをすべて「要約」配列に追加する必要があります。 「この配列の内容を別の配列に追加する」方法がわからないので、小さい配列を繰り返す必要があるようです。これまではこれが私が必要なことをしています。しかし、大きな配列に追加すると正しく動作しないようです。これを行った後、大きな配列に追加し、大きな配列の長さを確認すると、常に「1」になります。

スクリプトの関連部分は次のとおりです。

nslist=$(...)
pnarray=()
for ns in $nslist; do
    IFS=$'\n' nspnarray=($(...))
    echo "nspnarray.len[${#nspnarray[@]}]" # This looks fine
    for pn in ${nspnarray[@]}; do
        echo "pn[$pn]" # This looks fine
        IFS=$'\n' pnarray+=$pn # Something wrong with this?
        echo "pnarray.len[${#pnarray[@]}]" # is always 1
    done
done

これは完全なスクリプトではないので、明確になることを願っています。 「This looking good」というコメントがある行に、私が望む内容が印刷されます。私のサンプルデータでは、 "nspnarray"割り当てから呼び出されたコマンドラインは5行の出力を生成し、 "nspnarray.len"印刷ステートメントは "5"を表示しました。

次に、5つの項目をそれぞれ繰り返し印刷します。まだ大丈夫そうです。期待どおりにスペースを含む値を印刷します。その後、これを「要約」配列に割り当ててから要約配列の長さを印刷しようとすると、常に「1」が印刷されます。 「これはなぜ問題なの?」課題を間違えたと思います。ワイヤー。

ベストアンサー1

ある配列を別の配列に追加するのは非常に簡単です。

$ a=(1 2 3)
$ b=(4 5 6)
$ a+=("${b[@]}")
$ typeset -p a
declare -a a=([0]="1" [1]="2" [2]="3" [3]="4" [4]="5" [5]="6")

ただし、配列を使用して比較的複雑な操作を実行する場合は、その操作に適した言語を使用する必要があります。 awkまたはperl例えば。またはpython。またはbashや他のシェルを除くほとんどすべて。

シェルは、タスクを実行したりデータを処理したりするために、他のプログラムの実行(他のプログラムへのパイプ、stdin、stdoutリダイレクトなど)の実行を調整するのに適しています。本質的に、これらの他のタスクを実行するのはうまくいきません。実際には不都合ではありません。

awk多次元配列(索引付けおよび関連)があるperlだけでなく、配列またはハッシュが任意の深さに入れ子になった他の配列および/またはハッシュを含むことができるデータ構造もあります。他のほとんどの言語も複雑なデータ構造を持っています。

そして同様に重要なことは、シェルが持っている引用や単語分割の問題に苦しんでいないということです。

おすすめ記事