スクリプトへの引数の受け渡し

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

はじめに

Shell プログラミングにおいて、スクリプトに引数(引数:ひきすう)を渡す機能は、基本的かつ非常に強力な機能です。コマンドラインからの入力を受け付けることで、スクリプトの柔軟性と再利用性が大幅に向上します。この実験では、コマンドライン引数を受け取って利用する Shell スクリプトの作成プロセスを学習します。スクリプト内でこれらの引数にアクセスする方法、複数の引数を処理する方法、および特殊変数を使用して効率的に処理する方法を習得します。

これはガイド付きの実験(Guided Lab)であり、学習と実践を支援するためのステップバイステップの指示を提供します。各ステップの指示に従って進めることで、実戦的な経験を積むことができます。これまでのデータによると、この実験は初級レベルで、完了率は 96% です。また、学習者から 100% の高評価を得ています。

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

まずは、新しいスクリプトファイルを作成することから始めましょう。この実験では WebIDE (VS Code) を使用します。

  1. WebIDE が開いていない場合は開きます。
  2. 左側のファイルエクスプローラーで、/home/labex/project ディレクトリに移動します。
  3. ファイルエクスプローラー内を右クリックし、「New File」を選択します。
  4. ファイル名を arguments.sh と入力します。

ファイルが作成できたら、スクリプトの基本構造を追加しましょう。

#!/bin/bash

## Your code will go here

最初の行は「シバン(shebang)」または「ハッシュバン」と呼ばれます。これは、スクリプトを実行するためにどのインタプリタを使用するかをシステムに伝えるものです。今回は bash を使用します。

初心者向けヒント:シバン行は非常に重要です。これがあることで、毎回 bash arguments.sh と入力しなくても、./arguments.sh のようにスクリプトを直接実行できるようになります。細かい点ですが、スクリプトの利便性が向上します。

スクリプト引数へのアクセス

次に、スクリプトに渡された引数にアクセスして表示するように変更してみましょう。Shell スクリプトでは、コマンドライン引数にアクセスするために特殊な変数が用意されています。

  • $0:スクリプト自体の名前を表します。
  • $1, $2, $3 ...:それぞれ 1 番目、2 番目、3 番目の引数を表します。

arguments.sh ファイルに以下のコードを追加してください。

#!/bin/bash

echo "Script name: $0"
echo "First argument: $1"
echo "Second argument: $2"
echo "Third argument: $3"

このスクリプトは、スクリプト名と、渡された最初の 3 つの引数を表示します。

初心者向けヒント:

  • bash では、変数(値を格納する箱)を参照するために $ 記号を使用します。
  • $0, $1, $2 などは、引数を付けてスクリプトを実行したときに bash が自動的に設定してくれる特殊な変数です。
  • 引数を指定せずにスクリプトを実行した場合、$1, $2, $3 は空になりますが、スクリプト自体はエラーにならずに実行されます。

スクリプトを実行可能にする

スクリプトを実行する前に、実行権限を付与する必要があります。これには chmod コマンドを使用します。ターミナルでプロジェクトディレクトリに移動し、次のコマンドを実行してください。

cd /home/labex/project
chmod +x arguments.sh

chmod +x コマンドはファイルに実行権限を追加し、ファイルがスクリプトとして実行されることを許可します。

初心者向けヒント:

  • chmod は "change mode" の略です。ファイルやディレクトリの権限(パーミッション)を変更するために使用します。
  • +x オプションは実行権限を追加します。bash がファイルをスクリプトとして動かすために必要です。
  • このステップを忘れると、スクリプトを実行しようとしたときに "permission denied"(許可がありません)というエラーが表示されます。

引数を指定してスクリプトを実行する

スクリプトが実行可能になったので、いくつか引数を渡して実行してみましょう。ターミナルで次のコマンドを実行します。

./arguments.sh hello world example

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

Script name: ./arguments.sh
First argument: hello
Second argument: world
Third argument: example

この出力から、スクリプトがコマンドライン引数に正しくアクセスし、表示できていることがわかります。

初心者向けヒント:

  • スクリプト名の前にある ./ は、現在のディレクトリにあるスクリプトを探すよう bash に指示するものです。
  • スクリプト名の後の各単語が、それぞれ独立した引数になります。この例では、"hello" が第 1 引数、"world" が第 2 引数、"example" が第 3 引数になります。
  • スペースを含む文字列を 1 つの引数として渡したい場合は、./arguments.sh "hello world" example のように引用符(クォート)で囲む必要があります。

引数の数に応じた処理

次に、渡された引数の数に応じて処理を変えるようにスクリプトを改良しましょう。スクリプトに渡された引数の総数を保持する $# という特殊変数を使用します。

arguments.sh ファイルの内容を以下のように更新してください。

#!/bin/bash

if [ $## -eq 0 ]; then
  echo "No arguments provided."
elif [ $## -eq 1 ]; then
  echo "One argument provided: $1"
elif [ $## -eq 2 ]; then
  echo "Two arguments provided: $1 and $2"
else
  echo "More than two arguments provided:"
  echo "First argument: $1"
  echo "Second argument: $2"
  echo "Third argument: $3"
  echo "Total number of arguments: $#"
fi

このスクリプトは、条件分岐(if 文)を使用して、引数の数に応じたメッセージを表示します。

初心者向けヒント:

  • $# は、スクリプトに渡された引数の数が入っている特殊変数です。
  • [ $## -eq 0 ] は、引数の数が 0 と等しいかどうかをチェックする条件式です。
  • elif は "else if" の略です。複数の条件を順番にチェックしたい場合に使用します。
  • -eq 演算子は "equal to"(等しい)を意味します。他にも -lt (less than:より小さい)、-gt (greater than:より大きい) などの演算子があります。

更新したスクリプトのテスト

それでは、引数の数を変えてスクリプトをテストしてみましょう。

./arguments.sh
./arguments.sh one
./arguments.sh one two
./arguments.sh one two three four

指定した引数の数に基づいて、異なる出力が表示されるはずです。

初心者向けヒント:

  • 引数なしで実行すると (./arguments.sh)、スクリプト内の最初の条件が実行されます。
  • コマンドごとに引数を増やしていくことで、スクリプトがそれぞれのケースをどのように処理するかを確認できます。
  • 引数の数によってスクリプトの挙動が変わる様子に注目してください。このような柔軟性は、実務のスクリプト作成において非常に役立ちます。

すべての引数をループで処理する

最後に、すべてのコマンドライン引数を表す $@ という特殊変数を使用して、提供されたすべての引数をループ処理するようにスクリプトを修正しましょう。

arguments.sh ファイルの内容を以下のように更新してください。

#!/bin/bash

echo "Total number of arguments: $#"
echo "All arguments:"

count=1
for arg in "$@"; do
  echo "Argument $count: $arg"
  count=$((count + 1))
done

このスクリプトは for ループを使用して、すべての引数を順番に取り出し、その位置(番号)とともに表示します。

初心者向けヒント:

  • $@ は、スクリプトに渡されたすべての引数をリストとして保持する特殊変数です。
  • for ループは、リスト内の項目を 1 つずつ処理するために使用されます。ここでは、すべての引数を 1 つずつ処理しています。
  • $((count + 1)) は bash における算術式展開です。count 変数の値を 1 増やすために使用しています。
  • このスクリプトは引数がいくつあっても動作するため、以前のバージョンよりもさらに柔軟性が高まっています。

最終的なスクリプトのテスト

複数の引数を指定して、最終的なスクリプトをテストしてみましょう。

./arguments.sh apple banana cherry date

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

Total number of arguments: 4
All arguments:
Argument 1: apple
Argument 2: banana
Argument 3: cherry
Argument 4: date

これにより、スクリプトが任意の数の引数を処理し、それらすべてを表示できることが証明されました。

初心者向けヒント:

  • この最終バージョンのスクリプトは、初期のものに比べてはるかに汎用性が高いです。
  • 引数が 0 個でも 100 個でも適切に処理できます。
  • 各引数に番号を振って表示する手法は、より複雑なスクリプトを作成する際に非常に便利です。
  • 引数の数をいろいろ変えて実行し、挙動を確認してみてください。

まとめ

この実験では、コマンドライン引数を受け取って処理する Shell スクリプトの作成方法を学びました。学習した主な概念は以下の通りです。

  1. スクリプトの作成と実行権限の付与
  2. 特殊変数($1, $2 など)を使用した個別の引数へのアクセス
  3. $# 変数を使用した引数の総数の取得
  4. 引数の数に応じた条件分岐ロジックの実装
  5. $@ 変数を使用したすべての引数のループ処理

これらのスキルは Shell スクリプトの基礎であり、さまざまな入力に適応できる柔軟で強力なスクリプトを作成することを可能にします。Shell スクリプトの学習を続ける中で、コマンドライン引数の処理能力は、システム管理や自動化における多様なタスクをこなすための再利用可能なツールを作る上で不可欠なものであると実感するでしょう。