1. ホーム
  2. arrays

[解決済み] Bashで文字列を配列に分割する方法は?

2022-03-20 18:14:33

質問

Bashスクリプトで、1行を分割して配列に格納したいのですが、どうすればいいですか?

例えば、こんな行があったとします。

Paris, France, Europe

出来上がった配列は、次のようにしたい。

array[0] = Paris
array[1] = France
array[2] = Europe

シンプルな実装が望ましく、スピードは問わない。どうすればいいのでしょうか?

どのように解決するのですか?

IFS=', ' read -r -a array <<< "$string"

の文字に注意してください。 $IFS は個別にセパレータとして扱われるので、この場合、フィールドの区切りは どちらか という2つの文字の並びではなく、カンマやスペースが使われます。しかし、興味深いことに、スペースは特別に扱われるため、入力にカンマとスペースが現れると空のフィールドは作られない。

個々の要素にアクセスする場合。

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]}"

2.05b 以降のすべてのバージョンの Bash で使用可能です。

echo "${array[@]: -1:1}"

負のオフセット値を大きくすると、配列の末尾からより遠い位置が選択されます。古い形式では、マイナス記号の前にスペースがあることに注意してください。これは必須です。