Bash スクリプトで、行を分割して配列に格納したいと思います。
たとえば、次の行があるとします。
Paris, France, Europe
結果の配列は次のようになります。
array[0] = Paris
array[1] = France
array[2] = Europe
シンプルな実装が望ましいです。速度は重要ではありません。どうすればいいでしょうか?
ベストアンサー1
IFS=', ' read -r -a array <<< "$string"
内の文字はそれぞれ区切り文字として扱われるため、この場合、フィールドは 2 つの文字のシーケンスではなく、コンマまたはスペースのいずれか$IFS
で区切られることに注意してください。興味深いことに、入力にコンマとスペースが表示されても、スペースは特別に扱われるため、空のフィールドは作成されません。
個々の要素にアクセスするには:
echo "${array[0]}"
要素を反復処理するには:
for element in "${array[@]}"
do
echo "$element"
done
インデックスと値の両方を取得するには:
for index in "${!array[@]}"
do
echo "$index ${array[index]}"
done
最後の例は、Bash 配列がスパースであるため便利です。つまり、要素を削除したり、要素を追加したりすると、インデックスが連続しなくなります。
unset "array[1]"
array[42]=Earth
配列内の要素数を取得するには:
echo "${#array[@]}"
上で述べたように、配列はスパースになる可能性があるため、最後の要素を取得するために長さを使用しないでください。Bash 4.2 以降では、次のように使用できます。
echo "${array[-1]}"
どのバージョンの Bash でも (2.05b 以降):
echo "${array[@]: -1:1}"
負のオフセットが大きいほど、配列の末尾からさらに離れた位置が選択されます。古い形式では、マイナス記号の前のスペースに注意してください。これは必須です。