現場で使えるシェルスクリプト入門5 配列と for文

bashの配列は複数の値をまとめて扱うための仕組みです。
ログ処理、ファイル一覧の操作、複数サーバへの処理など、実務では for 文と組み合わせて使う場面が非常に多くなります。

この記事では、配列の基本、展開方法 、値の追加・変更・削除、for 文との組み合わせの流れでまとめています。

配列の基本

bash の配列は次のように定義します。

names=("taro" "jiro" "saburo")

スペース区切りで複数の値を入れられます。

配列の展開

配列内の各要素には0から始まるインデックスが付けられ、次のように参照します。

echo "${names[0]}"  # taro
echo "${names[1]}"  # jiro
echo "${names[2]}"  # saburo

全要素は次のように展開できます。

echo "${names[@]}"   # taro jiro saburo

要素数の取得方法です。

echo "${#names[@]}"  # 3

インデックス一覧を取得する方法です。

echo "${!names[@]}"  # 0 1 2

値の追加・変更・削除

要素の追加方法です。

names+=("shiro")
echo "${names[@]}"  # taro jiro saburo shiro

指定した要素の変更方法です。

names[1]="jiro_updated"
echo "${names[@]}"  # taro jiro_updated saburo

要素の削除方法です。
一旦要素をunsetコマンドで要素を削除した後にインデックスを詰め直す必要があります。
インデックスを詰め直すのは、「要素削除で自動的に詰める」機能がないため、unsetするとインデックスが欠番になるからです。

names=("taro" "jiro" "saburo")
# unsetコマンドで対象要素[1]を削除する
unset 'names[1]'  # 実行後インデックスは「0 2」の歯抜け状態になる
# 配列に要素を再設定し、インデックスを詰め直す
names=("${names[@]}")
echo "${!names[@]}"  # 0 1。インデックスは詰め直される

配列と for 文の組み合わせ

配列を使う最大のメリットは、for 文でまとめて処理できる点です。
やり方は複数ありますが、先ずは配列を展開して処理する方法です。

names=("taro" "jiro" "saburo")
for name in "${names[@]}"; do
    echo "$name"
done

実行結果:

taro
jiro
saburo

次はインデックスを使った処理方法です。
インデックス番号も併せて取得したい時におすすめです。

names=("taro" "jiro" "saburo")
for i in "${!names[@]}"; do
    echo "index: $i, value: ${names[$i]}"
done

実行結果:

index: 0, value: taro
index: 1, value: jiro
index: 2, value: saburo

最後はC言語風なfor文です。
他言語で慣れている方におすすめです。二重丸括弧(( ))であることに注意してください。

names=("taro" "jiro" "saburo")
for ((i = 0; i < "${#names[@]}"; i++)); do
    echo "${names[i]}"
done

実行結果:

taro
jiro
saburo

コメント

タイトルとURLをコピーしました