プログラムに引数を渡すことは、使用するすべての言語で一般的な操作の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ヒアドキュメントチュートリアル