Bash で文字列を配列に分割するにはどうすればいいですか? 質問する

Bash で文字列を配列に分割するにはどうすればいいですか? 質問する

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

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

おすすめ記事