Bashスクリプトの関数に配列を渡す

Bashスクリプトの関数に配列を渡す

私はbashスクリプトとbashスクリプトの作成が初めてです。配列を宣言し、値を指定しました。しかし、ループから配列を渡すと、値はループに入りません。以下は私のコードです

declare -a files=( "A1S0" "D1S0" "D2S0" "D3S0" "D4S0" "D5S0" "D6S0" )
command_to_get_filesizes() {
  for i in "${!files[@]}"; do
     echo Processing file "${i[${index}]}"
  done
}
command_to_get_filesizes

期待される出力

A1S0
D1s0
D2S0
D3S0
D5S0
D680

しかし、私が得た結果は

Processing file 0
Processing file 1
Processing file 2
Processing file 3
Processing file 4
Processing file 5
Processing file 6

誰でも配列の値を印刷するのに役立ちますか?

答え1

変数 'index' が定義されていません。あなたの意図は

echo Processing file "${files[i]}"

原作の役割があいまいだ。すべての変数は(おそらく)0番目の要素を持つ配列です。 (試してみてくださいecho "${PATH[$junk]}"。)全体構成は"${i[${index}]}"次のように解決されます${i[0]}。これはちょうどechoです$i

タイトルが少し誤解を招く場合があります。配列を関数にパラメータとして渡すのではなく、グローバル配列変数だけです。

@Sivaは、配列値を簡単に繰り返すことができるという点で正確です。ただし、同じ反復でインデックスと値の両方が必要な場合は、この方法が適しています。

for n in "${!N[@]}"; do
    printf '%8d  %s\n' "${n}" "${N[n]}"
done

答え2

予想出力に基づいて

  • echoこのコマンドには「プロセスファイル」は必要ありません。
  • ループ内で配列を繰り返すときに配列のインデックス値を渡す必要はありませんfor

次のように試す

declare -a files=( "A1S0" "D1S0" "D2S0" "D3S0" "D4S0" "D5S0" "D6S0" )
command_to_get_filesizes() 
{
  for i in "${files[@]}"; do
    echo "$i"
  done
}
command_to_get_filesizes

関連情報