プログラムに引数を渡すことは、使用するすべての言語で一般的な操作の1つです。同様に、この記事では、Linuxでgetoptsbash組み込み関数を使用してbashスクリプトの引数を解析する方法を説明します。
はじめに
ターミナルで実行するすべてのコマンドには、引数が関連付けられています。たとえば、Linuxで dfという名前の最も基本的なコマンドを実行できます。 ファイルシステムのディスク容量を表示します。 -h
のような引数/フラグを受け入れます 、-i
、--version
、など。
これと同様に、ユースケースに応じてシェルスクリプトを作成する場合、渡された引数に基づいてスクリプトを処理する必要がある場合があります。
bashでスクリプトに渡された引数を解析する方法は2つあります。
1つは、特別な変数[email protected]、$ 1、$2…$Nを使用して引数を手動で解析するロジックを作成することです。もう1つの方法は、 getoptsを使用することです。 。
Getoptsは、POSIX互換のbash組み込み関数であり、-h
のような短い引数を受け入れます。 、-v
、-b
、など。--help
のような長い引数を渡すことはできません。 、--version
。長いオプションを解析したい場合は、 getoptと呼ばれる別のユーティリティがあります これは外部プログラムであり、bash組み込みではありません。
フラグ/引数を操作するときに考えられるシナリオは3つあります。
- 引数またはフラグが渡されない場合でも実行されるスクリプト。
- フラグを受け入れるが引数を持たないスクリプト。
- フラグとフラグに関連する引数を受け入れるスクリプト。
次のセクションでは、上記のシナリオを満たすbashスクリプトを作成する方法を学習します。
ヘルプの取得
次のヘルプコマンドを実行して、getoptsヘルプセクションにアクセスできます。
$ getopts -help
Getoptsのコアコンストラクト
getoptsを使用するために知っておくべき4つの重要な用語があります。
getopts: getopts optstring name [arg …]
-
OPTSTRING
-引数として認識される文字のリスト。例:-h
、-v
。 -
OPTNAME
-[email protected]
から解析された引数OPTNAME
に保存されます 変数。 optnameとして任意の名前を使用できます。 -
OPTARG
-渡された追加の引数がある場合、それはOPTARG
に保存されます 変数。 -
OPTIND
-処理される次の引数を指すインデックス。
スクリプトに引数を渡すと、引数は変数[email protected]に格納されます。Getoptsは、[emailprotected]から引数のリストを取得します。useOPTIND
解析します。
認識される引数のリストは、OPTSTRING
で指定する必要があります 。 whileループは、渡された引数のリストを反復処理し、OPTIND
を使用するために使用されます 、getoptsは引数を取得し、それをOPTNAME
に格納します 。
caseステートメント パターンがOPTNAME
と一致するかどうかを確認するために使用されます 対応するステートメントを実行します。
記事全体を通して以下のコードを実行します。これは理解するのに簡単なコードです。まず、「ヘルプ」という名前の関数を作成しました "私のスクリプトの使用構文があります。
OPTSTRINGで3つの引数を使用しています。 "-s
、-T
、-h
"。ARG
という名前の変数 OPTNAME
です 以下のコードで使用されます。解析された引数は$ARG
に保存されます そして、caseステートメントを使用して、パターンがARG
の引数と一致するかどうかを見つけようとします。 変数。
次のスクリプトは、-s
のようなフラグを受け入れます 、-h
、-T
-shT
のようなフラグを組み合わせることもできます 。
#!/bin/bash function help(){ echo "USAGE: args.sh -s, -T <arg>, -h" } while getopts ":sT:h" ARG; do case "$ARG" in s) echo "Running -s flag" ;; T) echo "Running -T flag" echo "Argument passed is $OPTARG" ;; h) help ;; :) echo "argument missing" ;; \?) echo "Something is wrong" ;; esac done shift "$((OPTIND-1))"
上記のコードの機能については、次のセクションで詳しく説明します。
引数が渡されません
getoptsのデフォルトの動作は、引数が渡されない場合、エラーメッセージをスローせず、リターンコードゼロで終了します。 。
場合によっては、引数が渡されていないときにスクリプトを実行しないでください。その場合、条件ステートメントを使用して、渡された引数の長さを確認できます([email protected]
)がゼロかどうか。引数が渡されない場合、スクリプトは失敗します。
以下のコードを見てください。渡された引数を変数PASSED_ARGS
に格納しています そしてその長さをチェックします。 PASSED_ARGS
の長さの場合 がゼロでない場合は、while loop
getoptsを使用すると実行されます。それ以外の場合は、help
関数が実行され、スクリプトはリターンコード 1で終了します 。
[email protected] if [[ ${#PASSED_ARGS} -ne 0 ]] then while getopts ":sT:h" ARG; do case "$ARG" in s) echo "Running -s flag" ;; T) echo "Running -T flag" echo "Argument passed is $OPTARG" ;; h) help ;; :) echo "argument missing for $ARG" ;; \?) echo "Something is wrong" ;; esac done else help exit 1 fi shift "$((OPTIND-1))"
次のワンライナーを使用して、渡された引数を評価することもできます。
[[ ${#PASSED_ARGS} -ne 0 ]] && echo "Arguments stored in \[email protected] = [email protected]" || { echo "No argument passed"; help; exit 1; }
フラグ付きの引数とそのサポートされている引数
-h
のようなフラグを渡すことができます または-s
スクリプトまたはフラグ、および-T
などの関連する引数に それに。 コロンを追加する必要があります (: )フラグ識別子の後(-T
)フラグに引数を受け入れさせる。
以下のコードでは、コロンを追加したことがわかります(:
)識別子T
の後 。 -T
を渡すと スクリプトにフラグを立てる場合は、追加の引数を渡す必要があります。
while getopts ":sT:h" ARG; do
引数がフラグに渡されると、変数$OPTARG
に格納されます。 。変数をキャプチャしてそれに応じて処理するロジックを作成する必要があります。前のセクションと同じコードをコピーして実行します。
T) echo "Running -T flag" echo "Argument passed is $OPTARG" ;;
一度に複数の引数を組み合わせて実行することもできます。
エラーの処理
引数が間違って渡され、スクリプトがエラーをスローする場合があります。
デフォルトでは、渡されたフラグがOPTSTRING
にない場合、getoptsはエラーメッセージをスローします。 または、フラグに追加の引数を渡さなかった場合。 コロンを追加する OPTSTRING
の先頭まで デフォルトのエラーメッセージを抑制します。
コロンを削除して、スクリプトを再度実行してみましょう。 -x
を渡します OPTSTRING
に存在しない最初の引数として 。次に、-T
提供できなかった追加の引数が必要です。どちらの場合も、エラーが発生します。
これで、デフォルトのエラーメッセージを抑制し、独自のエラーメッセージを出力できます。ケースステートメントから以下のパターンを見てください。
- コロン(:) ->追加の引数が渡されない場合
OPTARG
コロンに設定され、エラーメッセージを出力するロジックを記述できます。 - \? ->
OPTSTRING
にない引数の場合 渡される、OPTNAME
「?
」に設定されます "。
:) echo "argument missing" ;; \?) echo "Something is wrong" ;;
ShiftとOPTINDの使用
getoptsを使用して記述された既存のスクリプトを使用する場合、while
の後にこのステートメントが表示されます。 ループ。
shift "$((OPTIND-1))"
スクリプトがトリガーされると、OPTIND
1に設定されています 。 OPTIND
getoptsによって処理される次の引数の位置を指します。
上記のステートメントは、getoptsと$1
によって解析されたすべてのオプションを削除します スクリプトに渡される最初のオプションではない引数には設定されません。
結論
この記事では、getopts関数を使用してbashスクリプトの引数を解析する方法を見てきました。 Getoptsは短い形式の引数のみをサポートし、長い引数を渡すことはできません。
最初は、getoptsを使用するのは難しいように思われるかもしれません。しかし、コアコンセプトを理解していれば、それは簡単になります。
同様の読み取り:
- LinuxのBashスクリプトでCSVファイルを解析する方法
Bashスクリプトガイド:
- LinuxおよびUnixでZenityを使用してBashスクリプトでGUIダイアログボックスを作成する方法
- Bashスクリプティング–ケースステートメント
- Bashスクリプティング–条件付きステートメント
- Bashスクリプティング–文字列操作
- Bashスクリプティング–例を使用して説明されたPrintfコマンド
- Bashスクリプティング–例を使用して説明されたインデックス付き配列
- Bashスクリプティング–例を使用して説明された連想配列
- Bashスクリプティング–例で説明されているForループ
- Bashスクリプティング–ループの説明中およびループまで
- 例を使用して説明されたBashリダイレクト
- Bashスクリプティング–例で説明されている変数
- Bashスクリプティング–例で説明されている関数
- Linuxの例で説明されているBashEchoコマンド
- 初心者向けのBashヒアドキュメントチュートリアル