Bashは新しいインデックスに配列を追加しません。最初のインデックスのみ拡張

Bashは新しいインデックスに配列を追加しません。最初のインデックスのみ拡張

Bashで配列を扱っていますが、特定の配列が奇妙に動作します。

関数を使用し、次のように配列に追加する値を返す外部スクリプトを呼び出しています。

function get_unit_coverage() {

 for sub_unit in "$@"
 do
     extracted_value=$( ./external_script.sh $file $sub_unit )
     my_array+=$extracted_value
 done
}

関数に配列を渡し、繰り返しごとに配列が追加されることを期待します。

ただし、次を返します。

echo "${my_Array[0]}"

はい

52.5500%66.6400%16.4300%47.8800%40.6600%45.6800%43.3400%74.5100%87.4600%45.6300%65.6100%58.0900%%47.5800%5.9500%7.6500%1.8000%

external_script.shは単に値を反映しています。これは潜在的な問題ですか?

答え1

配列に新しい要素を追加するには:

array+=( new elements here )

あなたの場合:

my_array+=( "$extracted_value" )

するとき

array+=$variable

配列の最初の要素に追加しようとしています。それは同じです

array[0]+=$variable

また

extracted_value=$( ./external_script.sh $file $sub_unit )

値は$fileスペース $sub_unitとファイル名のグロービングに分割されます。これを防ぐには、代わりに と"$file"を使用します"$sub_unit"(つまり、二重引用符を使用した引用変数の拡張)。

同様に言えば

my_array+=( $extracted_value )

値を複数の単語に分割$extracted_valueし、各単語は配列に新しい要素を作成するためのファイル名のグロービングになります。 (すでに述べたように)このように書く方が良いでしょう。

my_array+=( "$extracted_value" )

これは一般的なアドバイスなので、そうする理由はありません。いいえかどうかにかかわらずこれを行う知るあなたの値はすでにワイルドカード文字を持たない単一の単語です。

答え2

文字列に追加して配列として読みます(Kusalanandaが上記のように)。しかし、あなたの質問は、変数を配列として扱う方法を示しています。実際、単純な変数は簡単に配列に変換できます。

$ a+=1
$ a+=2
$ echo "$a"
12
$ echo "${a[0]}"
12
$ a+=(3)
$ echo "$a"
12
$ echo "${a[0]}"
12
$ echo "${a[1]}"
3

関連情報