はじめに

プログラミングでは、ファイル名、ユーザー ID、サーバー名など、関連する項目のリストを保存する必要がよくあります。項目ごとに file1、file2、file3 のような個別の変数を作成する代わりに、配列(Array) と呼ばれる 1 つの変数を使用できます。

配列(array) を使うと、1 つの名前で複数の値を保存できます。項目を追加、削除、読み取りできるリストのようなものだと考えてください。

1 つの変数だけでは足りなくなったとき、配列が役立ちます。サーバーのリスト、ファイル名、パッケージ名、ユーザーアカウントなどは、1 つずつではなくグループとして扱うのが自然なデータの例です。

この実験では、次の方法を学びます。

  1. 初期値を指定して配列を 宣言 する。
  2. 配列に新しい項目を 追加 する。
  3. 配列内のすべての要素を 表示 する。
  4. 配列を 反復処理(ループ)して、各項目を個別に処理する。

配列を宣言する

まず、名前のリストを保持するスクリプトを作成します。

配列を使うと、関連する値を複数の変数に分散させず、グループとして扱えます。スクリプトで 1 つの項目ではなく、項目の集合を処理するときに便利です。

array_lab.sh スクリプトを作成します。

cd ~/project
nano array_lab.sh

次のコードを入力して、配列を初期化します。

#!/bin/bash

## Define an array named 'names'
names=("Alice" "Bob")

構文ルール:

  • 値のリストを括弧 () で囲みます。
  • 項目はコンマではなく、スペース で区切ります。
  • ("Alice" "Bob") は正しい形式です。("Alice", "Bob") は正しくありません。コンマが文字列 "Alice," の一部として扱われるためです。

この点は、より一般的な shell のルールにも関係します。Bash の構文は単純に見えても、句読点の小さな違いによって意味が変わります。配列は、他の言語で使われるようなコンマ区切りのリストではなく、空白区切りのリストです。

保存(Ctrl+O)して終了(Ctrl+X)します。

ファイルの内容を確認します。

cat array_lab.sh

これで配列変数を定義できました。ただし、スクリプトはまだ何も出力しません。

配列に要素を追加する

リストに含めるすべての項目が、スクリプトの開始時点で分かっているとは限りません。スクリプトの実行中に、項目を動的に追加することがあります。

これは実際のスクリプトでよくある処理です。実行中に見つかった条件に一致するファイル、アクティブなホスト、失敗したサービス、パッケージ名などを配列に追加できます。

+= 演算子を使うと、配列の末尾に新しい項目を追加できます。

スクリプトを開きます。

nano array_lab.sh

ファイルの末尾に次の行を追加します。

## Append 'Charlie' to the list
names+=("Charlie")

説明:

  • += は「既存の値に追加する」という意味です。
  • ("Charlie") のように新しい項目を括弧で囲むことで、配列の要素として扱われます。

これで、ファイルは次のようになります。

#!/bin/bash

## Define an array named 'names'
names=("Alice" "Bob")

## Append 'Charlie' to the list
names+=("Charlie")

保存して終了します。

すべての要素を表示する

配列に期待どおりのすべての値が含まれていることを確認するため、配列の全要素を一度に表示します。

Bash では、配列変数へのアクセス方法が通常の変数とは少し異なります。${array_name[@]} を使うと、すべての要素を展開できます。

  • @ は「すべての要素」を表すワイルドカードとして機能する特殊な記号です。

${...} という形式は、パラメータ展開の一例でもあります。Bash は変数名をそのまま表示するのではなく、echo が最終的なテキストを受け取る前に、配列を保存されている要素へ展開します。

array_lab.sh を開きます。

nano array_lab.sh

表示コマンドを追加します。

## Print all elements in the array
echo "All Names: ${names[@]}"

保存して終了します。

スクリプトに実行権限を付与して実行します。

chmod +x array_lab.sh
./array_lab.sh

結果:

All Names: Alice Bob Charlie

${names[@]} が配列内のすべての項目を、スペース区切りのリストとして展開したことを確認できます。

配列を反復処理する

リスト全体を表示するとデバッグに役立ちますが、通常は各項目を個別に処理します。たとえば、リスト内の各名前に対してユーザーアカウントを作成する場合などです。

この処理には for ループを使います。

array_lab.sh を開きます。

nano array_lab.sh

ファイルの末尾に次のループを追加します。

echo "--- Processing Names ---"

## Loop through each item in the array
for name in "${names[@]}"; do
  echo "Hello, $name"
done

これで、スクリプト全体は次のようになります。

#!/bin/bash

names=("Alice" "Bob")
names+=("Charlie")

echo "All Names: ${names[@]}"

echo "--- Processing Names ---"
for name in "${names[@]}"; do
  echo "Hello, $name"
done

保存して終了します。次のコマンドで実行します。

./array_lab.sh

結果:

"${names[@]}" を引用符で囲むことも重要です。これにより、各配列要素がそれぞれ独立した項目として保持されます。要素にスペースが含まれる場合に、この違いが重要になります。実際のスクリプトでは、ファイル名や引数が常に単純な 1 語の文字列とは限らないためです。

All Names: Alice Bob Charlie
--- Processing Names ---
Hello, Alice
Hello, Bob
Hello, Charlie

このループは配列から各名前を 1 つずつ取り出し、変数 name に代入してから、コードブロックを実行しました。これは Bash でリストを扱う最も一般的な方法です。

まとめ

この実験では、Bash で配列を使うための基本を学びました。

  1. 宣言(name=(...)):初期値を指定してリストを作成する。
  2. 追加(+=):既存の配列に新しい項目を動的に追加する。
  3. 展開(${name[@]}):配列内のすべての項目を取得する。
  4. 反復処理(for):リスト内の各項目を 1 つずつ処理する。

複数のファイル、ユーザー、データ項目を効率的に扱うスクリプトを作成するには、配列が欠かせません。