Shell における配列の比較

ShellBeginner
オンラインで実践に進む

はじめに

この実験では、Shell スクリプトで配列を比較する方法を学びます。配列は複数の値を格納するのに便利なデータ構造であり、それらを比較することはプログラミングにおいてよくあるタスクです。今回は 3 つの配列を使用し、それらすべてに含まれる共通の要素を抽出するスクリプトを作成します。このプロセスを通じて、Shell スクリプトにおける配列の扱い方、ループ(繰り返し処理)、および条件分岐(if 文)の使い方を習得できます。

スクリプトファイルの作成

まず、スクリプトを記述するための新しいファイルを作成しましょう。

  1. WebIDE のターミナルを開きます。プロンプトの末尾に $ 記号が表示されているはずです。

  2. プロジェクトディレクトリに移動します。

cd ~/project

このコマンドは、現在の作業ディレクトリをプロジェクトフォルダに変更します。~ 記号はホームディレクトリを表し、/project はその中のサブフォルダです。

  1. array-comparison.sh という名前の新しいファイルを作成します。
touch array-comparison.sh

touch コマンドは空のファイルを作成します。ファイルが既に存在する場合は、内容を変更せずにタイムスタンプのみを更新します。

  1. WebIDE エディタでファイルを開きます。画面左側のファイルエクスプローラーでファイル名をクリックすると開くことができます。

シバン(Shebang)の追加と配列の初期化

次に、シバンを追加し、配列を初期化することからスクリプトの記述を始めます。

  1. array-comparison.sh に以下の内容を記述します。
#!/bin/bash

## 配列の初期化
a=(3 5 8 10 6)
b=(6 5 4 12)
c=(14 7 5 7)

コードの内容を解説します:

  • 最初の行 #!/bin/bash は「シバン(Shebang)」と呼ばれます。これは、このスクリプトを実行するために Bash インタプリタを使用するようシステムに指示するものです。シェルスクリプトにおいて非常に重要な一行です。
  • 次に、abc という 3 つの配列を初期化しています。Bash では、要素を括弧 () で囲み、スペースで区切ることで配列を定義します。
  • 各配列には異なる整数値が含まれています。これらの配列を比較して、共通の要素を探していきます。

最初の比較ループの実装

配列 a と配列 b の間に共通する要素を見つけるための、最初の比較ループを実装しましょう。

スクリプトに以下のコードを追加してください。

## a と b の共通要素を格納するための配列を初期化
z=()

## 配列 a と b を比較
for x in "${a[@]}"; do
  for y in "${b[@]}"; do
    if [ $x = $y ]; then
      z+=($x)
    fi
  done
done

echo "Common elements between a and b: ${z[@]}"

このコードの詳細を説明します:

  • z=() は、共通要素を格納するための空の配列 z を初期化しています。
  • for x in "${a[@]}" は、配列 a の各要素を順番に処理するループです。"${a[@]}" という構文は、配列のすべての要素を展開することを意味します。
  • その内側にネスト(入れ子)されたループ for y in "${b[@]}" があり、配列 b の各要素を順番に処理します。
  • if [ $x = $y ] で、配列 a から取り出した現在の要素と、配列 b から取り出した現在の要素が等しいかどうかをチェックします。
  • 等しい場合、z+=($x) を使ってその要素を配列 z に追加します。
  • 最後に、echo "Common elements between a and b: ${z[@]}" で共通要素を表示します。${z[@]} は配列 z の全要素を展開して表示します。

2 番目の比較ループの実装

次に、配列 c と、先ほど見つけた配列 zab の共通要素)を比較して、3 つすべてに共通する要素を見つけるループを実装します。

スクリプトに以下のコードを追加してください。

## a, b, c すべてに共通する要素を格納するための配列を初期化
j=()

## 配列 c と、z に格納された共通要素を比較
for i in "${c[@]}"; do
  for k in "${z[@]}"; do
    if [ $i = $k ]; then
      j+=($i)
    fi
  done
done

echo "Common elements among a, b, and c: ${j[@]}"

このコードは前のステップのループと似ていますが、いくつか重要な違いがあります:

  • 最終的な共通要素を格納するために、新しい空の配列 j を初期化します。
  • 外側のループ for i in "${c[@]}" は、配列 c の要素を処理します。
  • 内側のループ for k in "${z[@]}" は、配列 ab の共通要素が格納されている配列 z の要素を処理します。
  • c の要素と z の要素を比較し、一致するものがあれば配列 j に追加します。
  • 最後に、3 つすべての配列に共通する要素を表示します。

スクリプトの実行権限付与と実行

スクリプトが完成したので、実行権限を与えて動かしてみましょう。

  1. ターミナルで、スクリプトに実行権限を付与します。
chmod +x ~/project/array-comparison.sh

chmod コマンドはファイルの権限を変更します。+x オプションは実行権限を追加するもので、これによりスクリプトをプログラムとして実行できるようになります。

  1. スクリプトを実行します。
~/project/array-comparison.sh

このコマンドでスクリプトが起動します。~/project/ の部分はスクリプトへのパスを指定しています。

以下のような出力が表示されるはずです。

Common elements between a and b: 5 6
Common elements among a, b, and c: 5

この出力は以下のことを示しています:

  • 配列 ab に共通する要素は 5 と 6 です。
  • 3 つすべての配列(abc)に共通する要素は 5 です。

もしこの通りに表示されない場合やエラーが発生した場合は、スクリプトにタイポ(打ち間違い)や不足している部分がないか、もう一度確認してください。

まとめ

この実験では、Shell スクリプトで配列を比較する方法を学びました。ネストされたループと条件分岐を使用して、3 つの配列から共通の要素を見つけるスクリプトを作成しました。この演習を通じて、以下の重要な概念を習得しました:

  1. 配列の作成と初期化
  2. ネストされたループによる配列要素の比較
  3. 条件文(if 文)による値の一致確認
  4. 配列への要素の動的な追加
  5. スクリプトへの実行権限の付与と実行方法

これらのスキルは Shell スクリプトの基礎であり、将来より複雑なデータ処理タスクに取り組む際にも応用できます。配列操作は、データの集合を効率的に扱うための強力なツールです。

習得の鍵は練習です。配列の内容を変えてみたり、共通要素ではなく「特定の配列にしかないユニークな要素」を探すようにスクリプトを改造したりして、さらに理解を深めてみてください。ハッピー・スクリプティング!