スクリプトに引数を渡す

ShellShellBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

シェルプログラミングにおいて、スクリプトに引数を渡す機能は、基本的かつ強力な機能です。コマンドラインからの入力を受け付けることで、スクリプトをより柔軟で再利用可能にすることができます。この実験では、コマンドライン引数を受け付けて使用できるシェルスクリプトを作成するプロセスを案内します。スクリプト内でこれらの引数にアクセスする方法、複数の引数を処理する方法、および効率的に処理するための特殊な変数の使用方法を学びます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) shell(("Shell")) -.-> shell/BasicSyntaxandStructureGroup(["Basic Syntax and Structure"]) shell(("Shell")) -.-> shell/VariableHandlingGroup(["Variable Handling"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) shell(("Shell")) -.-> shell/ControlFlowGroup(["Control Flow"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") shell/BasicSyntaxandStructureGroup -.-> shell/shebang("Shebang") shell/BasicSyntaxandStructureGroup -.-> shell/comments("Comments") shell/VariableHandlingGroup -.-> shell/variables_usage("Variable Usage") linux/BasicFileOperationsGroup -.-> linux/touch("File Creating/Updating") linux/BasicFileOperationsGroup -.-> linux/chmod("Permission Modifying") shell/ControlFlowGroup -.-> shell/if_else("If-Else Statements") shell/ControlFlowGroup -.-> shell/for_loops("For Loops") subgraph Lab Skills linux/echo -.-> lab-388811{{"スクリプトに引数を渡す"}} shell/shebang -.-> lab-388811{{"スクリプトに引数を渡す"}} shell/comments -.-> lab-388811{{"スクリプトに引数を渡す"}} shell/variables_usage -.-> lab-388811{{"スクリプトに引数を渡す"}} linux/touch -.-> lab-388811{{"スクリプトに引数を渡す"}} linux/chmod -.-> lab-388811{{"スクリプトに引数を渡す"}} shell/if_else -.-> lab-388811{{"スクリプトに引数を渡す"}} shell/for_loops -.-> lab-388811{{"スクリプトに引数を渡す"}} end

新しいスクリプトファイルを作成する

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

  1. WebIDEが既に開いていなければ開きます。
  2. 左側のファイルエクスプローラーで、/home/labex/project ディレクトリに移動します。
  3. ファイルエクスプローラーで右クリックし、「新しいファイル」を選択します。
  4. 新しいファイルに arguments.sh と名前を付けます。

これでファイルを作成したので、スクリプトの基本構造を追加しましょう:

#!/bin/bash

## ここにコードを記述します

最初の行は「シェバン」または「ハッシュバン」と呼ばれます。これは、スクリプトを実行するために使用するインタプリタをシステムに知らせます。この場合、bashを使用しています。

初心者向けに:シェバン行は重要です。なぜなら、これにより毎回 bash arguments.sh と入力する代わりに、直接 ./arguments.sh のようにスクリプトを実行できるようになるからです。小さな細かい点ですが、スクリプトの使いやすさを向上させます。

スクリプト引数にアクセスする

次に、渡された引数にアクセスして表示するようにスクリプトを修正しましょう。シェルスクリプティングでは、特殊な変数を使ってコマンドライン引数にアクセスします:

  • $0 は、スクリプト自体の名前を表します
  • $1, $2, $3, などは、最初の引数、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 は「モード変更」を意味します。ファイルやディレクトリのパーミッションを変更するために使用されます。
  • +x オプションは実行許可を追加します。これは、bashがファイルをスクリプトとして実行できるようにするために必要です。
  • この手順を忘れると、スクリプトを実行しようとするときに「許可が拒否されました」というエラーが表示されます。

引数付きでスクリプトを実行する

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

./arguments.sh hello world example

次のような出力が表示されるはずです:

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

この出力は、スクリプトが正常にコマンドライン引数にアクセスして表示したことを示しています。

初心者向けに:

  • スクリプト名の前の ./ は、bashに対して現在のディレクトリからスクリプトを探すように指示します。
  • スクリプト名の後の各単語が個別の引数になります。この場合、「hello」が最初の引数、「world」が2番目、「example」が3番目です。
  • スペースを含む引数を渡したい場合は、引用符を使う必要があります。例えば:./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

このスクリプトは、条件文を使って引数の数が異なる場合を処理します。

初心者向けに:

  • $# は、スクリプトに渡された引数の数を含む特殊な変数です。
  • [ $## -eq 0 ] は、引数の数が0に等しいかどうかをチェックする条件です。
  • elif は「else if」の略です。これにより、複数の条件を順にチェックできます。
  • -eq 演算子は「等しい」を意味します。他にも -lt(未満)、-gt(超過)などの演算子があります。

更新されたスクリプトをテストする

次に、引数の数が異なる場合で更新されたスクリプトをテストしましょう:

./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 ループは、項目のリストを反復処理するために使用されます。この場合、すべての引数を反復処理しています。
  • $((count + 1)) は、bash の算術展開です。カウント変数をインクリメントするために使用されます。
  • このスクリプトは、任意の数の引数で動作します。以前のバージョンよりも柔軟性があります。

最終版のスクリプトをテストする

複数の引数を使って最終版のスクリプトをテストしましょう:

./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

これは、スクリプトが任意の数の引数を処理してすべてを表示できることを示しています。

初心者向けに:

  • このスクリプトの最終版は、初期バージョンよりもはるかに柔軟です。
  • ゼロから多数まで、任意の数の引数を処理できます。
  • スクリプトは現在、各引数に番号を付けています。これは、より複雑なスクリプトで非常に役立ちます。
  • 引数の数を変えてスクリプトを実行して、その動作を確認してみてください。

まとめ

この実験では、コマンドライン引数を受け取り処理するシェルスクリプトを作成する方法を学びました。いくつかの重要な概念を探りました:

  1. スクリプトを作成して実行可能にする
  2. 特殊な変数($1、$2など)を使って個々の引数にアクセスする
  3. 引数の数を決定するために$#変数を使用する
  4. 異なる数の引数を処理するための条件論理を実装する
  5. すべての提供された引数をループ処理するために$@変数を使用する

これらのスキルはシェルスクリプトにおいて基本的なものであり、異なる入力に対応できるより柔軟で強力なスクリプトを作成することができます。シェルスクリプトのスキルをさらに磨き続けるうちに、コマンドライン引数を処理する能力は、システム管理と自動化におけるさまざまなタスクに対して汎用性と再利用性の高いスクリプトを作成するために不可欠であることがわかります。