はじめに
この実験では、Shell スクリプトで配列を比較する方法を学びます。配列は複数の値を格納するのに便利なデータ構造であり、それらを比較することはプログラミングにおいてよくあるタスクです。今回は 3 つの配列を使用し、それらすべてに含まれる共通の要素を抽出するスクリプトを作成します。このプロセスを通じて、Shell スクリプトにおける配列の扱い方、ループ(繰り返し処理)、および条件分岐(if 文)の使い方を習得できます。
この実験では、Shell スクリプトで配列を比較する方法を学びます。配列は複数の値を格納するのに便利なデータ構造であり、それらを比較することはプログラミングにおいてよくあるタスクです。今回は 3 つの配列を使用し、それらすべてに含まれる共通の要素を抽出するスクリプトを作成します。このプロセスを通じて、Shell スクリプトにおける配列の扱い方、ループ(繰り返し処理)、および条件分岐(if 文)の使い方を習得できます。
まず、スクリプトを記述するための新しいファイルを作成しましょう。
WebIDE のターミナルを開きます。プロンプトの末尾に $ 記号が表示されているはずです。
プロジェクトディレクトリに移動します。
cd ~/project
このコマンドは、現在の作業ディレクトリをプロジェクトフォルダに変更します。~ 記号はホームディレクトリを表し、/project はその中のサブフォルダです。
array-comparison.sh という名前の新しいファイルを作成します。touch array-comparison.sh
touch コマンドは空のファイルを作成します。ファイルが既に存在する場合は、内容を変更せずにタイムスタンプのみを更新します。
次に、シバンを追加し、配列を初期化することからスクリプトの記述を始めます。
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 インタプリタを使用するようシステムに指示するものです。シェルスクリプトにおいて非常に重要な一行です。a、b、c という 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 の全要素を展開して表示します。次に、配列 c と、先ほど見つけた配列 z(a と b の共通要素)を比較して、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[@]}" は、配列 a と b の共通要素が格納されている配列 z の要素を処理します。c の要素と z の要素を比較し、一致するものがあれば配列 j に追加します。スクリプトが完成したので、実行権限を与えて動かしてみましょう。
chmod +x ~/project/array-comparison.sh
chmod コマンドはファイルの権限を変更します。+x オプションは実行権限を追加するもので、これによりスクリプトをプログラムとして実行できるようになります。
~/project/array-comparison.sh
このコマンドでスクリプトが起動します。~/project/ の部分はスクリプトへのパスを指定しています。
以下のような出力が表示されるはずです。
Common elements between a and b: 5 6
Common elements among a, b, and c: 5
この出力は以下のことを示しています:
a と b に共通する要素は 5 と 6 です。a、b、c)に共通する要素は 5 です。もしこの通りに表示されない場合やエラーが発生した場合は、スクリプトにタイポ(打ち間違い)や不足している部分がないか、もう一度確認してください。
この実験では、Shell スクリプトで配列を比較する方法を学びました。ネストされたループと条件分岐を使用して、3 つの配列から共通の要素を見つけるスクリプトを作成しました。この演習を通じて、以下の重要な概念を習得しました:
これらのスキルは Shell スクリプトの基礎であり、将来より複雑なデータ処理タスクに取り組む際にも応用できます。配列操作は、データの集合を効率的に扱うための強力なツールです。
習得の鍵は練習です。配列の内容を変えてみたり、共通要素ではなく「特定の配列にしかないユニークな要素」を探すようにスクリプトを改造したりして、さらに理解を深めてみてください。ハッピー・スクリプティング!