はじめに
Shell プログラミングにおいて、スクリプトに引数(引数:ひきすう)を渡す機能は、基本的かつ非常に強力な機能です。コマンドラインからの入力を受け付けることで、スクリプトの柔軟性と再利用性が大幅に向上します。この実験では、コマンドライン引数を受け取って利用する Shell スクリプトの作成プロセスを学習します。スクリプト内でこれらの引数にアクセスする方法、複数の引数を処理する方法、および特殊変数を使用して効率的に処理する方法を習得します。
Shell プログラミングにおいて、スクリプトに引数(引数:ひきすう)を渡す機能は、基本的かつ非常に強力な機能です。コマンドラインからの入力を受け付けることで、スクリプトの柔軟性と再利用性が大幅に向上します。この実験では、コマンドライン引数を受け取って利用する Shell スクリプトの作成プロセスを学習します。スクリプト内でこれらの引数にアクセスする方法、複数の引数を処理する方法、および特殊変数を使用して効率的に処理する方法を習得します。
まずは、新しいスクリプトファイルを作成することから始めましょう。この実験では WebIDE (VS Code) を使用します。
/home/labex/project ディレクトリに移動します。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 つの引数を表示します。
初心者向けヒント:
$ 記号を使用します。$0, $1, $2 などは、引数を付けてスクリプトを実行したときに bash が自動的に設定してくれる特殊な変数です。$1, $2, $3 は空になりますが、スクリプト自体はエラーにならずに実行されます。スクリプトを実行する前に、実行権限を付与する必要があります。これには chmod コマンドを使用します。ターミナルでプロジェクトディレクトリに移動し、次のコマンドを実行してください。
cd /home/labex/project
chmod +x arguments.sh
chmod +x コマンドはファイルに実行権限を追加し、ファイルがスクリプトとして実行されることを許可します。
初心者向けヒント:
chmod は "change mode" の略です。ファイルやディレクトリの権限(パーミッション)を変更するために使用します。+x オプションは実行権限を追加します。bash がファイルをスクリプトとして動かすために必要です。スクリプトが実行可能になったので、いくつか引数を渡して実行してみましょう。ターミナルで次のコマンドを実行します。
./arguments.sh hello world example
以下のような出力が表示されるはずです。
Script name: ./arguments.sh
First argument: hello
Second argument: world
Third argument: example
この出力から、スクリプトがコマンドライン引数に正しくアクセスし、表示できていることがわかります。
初心者向けヒント:
./ は、現在のディレクトリにあるスクリプトを探すよう bash に指示するものです。./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
これにより、スクリプトが任意の数の引数を処理し、それらすべてを表示できることが証明されました。
初心者向けヒント:
この実験では、コマンドライン引数を受け取って処理する Shell スクリプトの作成方法を学びました。学習した主な概念は以下の通りです。
$1, $2 など)を使用した個別の引数へのアクセス$# 変数を使用した引数の総数の取得$@ 変数を使用したすべての引数のループ処理これらのスキルは Shell スクリプトの基礎であり、さまざまな入力に適応できる柔軟で強力なスクリプトを作成することを可能にします。Shell スクリプトの学習を続ける中で、コマンドライン引数の処理能力は、システム管理や自動化における多様なタスクをこなすための再利用可能なツールを作る上で不可欠なものであると実感するでしょう。