引数をBashスクリプトに渡す方法

コマンド、構文、および例

スクリプトがコマンドラインから呼び出されたときに指定された引数を受け取るようにbashスクリプトを書くことができます。 このメソッドは、スクリプトが入力パラメータの値(引数)に応じて少し異なる関数を実行する必要がある場合に使用されます。

たとえば、単語の数をカウントするなど、ファイルに対して特定の操作を実行する「stats.sh」というスクリプトがあります。 多くのファイルでそのスクリプトを使用できるようにするには、ファイル名を引数として渡すのが最善です。そのため、処理するすべてのファイルに対して同じスクリプトを使用できます。 たとえば、処理されるファイルの名前が "songlist"の場合、次のコマンドラインを入力します。

sh stats.shの曲リスト

引数は$ 1、$ 2、$ 3などの変数を使ってスクリプト内でアクセスされます。$ 1は最初の引数、2は2番目の引数などです。 これは次の例に示されています。

FILE1 = $ 1 wc $ FILE1

読みやすくするために、最初の引数($ 1)の値にわかりやすい名前の変数を割り当て、この変数($ FILE1)で単語カウントユーティリティ( wc )を呼び出します。

引数の数が可変であれば、すべての入力パラメータの配列である "$ @"変数を使用できます。 これは、次の例に示すように、 forループを使用しループを繰り返し処理できることを意味します。

"$ @"内のFILE1の場合wc $ FILE1 done

コマンドラインからの引数を使用してこのスクリプトを呼び出す方法の例を次に示します。

sh stats.shソングリスト1ソングリスト2ソングリスト3

引数に空白がある場合は、一重引用符で囲む必要があります。 例えば:

sh stats.sh 'ソングリスト1' 'songlist 2' 'songlist 3'

ユーザーがフラグを使用して任意の順序で引数を渡すことができるように、スクリプトが頻繁に書き込まれます。 flagsメソッドを使用すると、引数の一部をオプションにすることもできます。

たとえば、 "username"、 "date"、 "product"などの指定されたパラメータに基づいてデータベースから情報を取得し、指定された "形式"でレポートを生成するスクリプトがあるとします。 スクリプトが呼び出されたときにこれらのパラメータを渡すことができるように、スクリプトを記述します。 次のようになります。

makereport -u jsmith -pノートブック-d 10-20-2011 -f pdf

Bashはこの機能を "getopts"関数で有効にします。 上の例では、次のようにgetoptsを使用できます。

これは引数を反復するために "getopts"関数といわゆる "optstring"(この場合は "u:d:p:f:")を使用するwhileループです。 whileループは引数を渡すために使用できるフラグを含むoptstringを通り、そのフラグに与えられた引数値を変数 "option"に代入します。 次に、caseステートメントは、すべての引数が読み込まれた後に使用できるグローバル変数に変数 "option"の値を代入します。

optstringのコロンは、対応するフラグに値が必要であることを意味します。 上記の例では、すべてのフラグの後にコロン "u:d:p:f:"が続きます。 つまり、すべてのフラグに値が必要です。 たとえば、 "d"と "f"フラグが値を持つことが予想されない場合、optstringは "u:dp:f"になります。

":u:d:p:f:"のように、オプトストリングの先頭のコロンは全く異なる意味を持ちます。 それはあなたがoptstringで表されていないフラグを処理することができます。 その場合、 "option"変数の値は "?"に設定されます。 "OPTARG"の値は予期しないフラグに設定されます。 これにより、間違いをユーザに知らせる適切なエラーメッセージを表示することができます。

フラグの前にない引数は、getoptsによって無視されます。 スクリプトの呼び出し時にoptstringで指定されたフラグが指定されていない場合は、コード内でこのケースを特別に処理しないかぎり、何も起こりません。 getopsによって処理されない引数は、通常の$ 1、$ 2などの変数で取り込むことができます。