シェルスクリプトにオプションを追加します。
ターミナルコマンドには通常、ユーザーがコマンドの実行方法を変更できるオプションがあります。オプションはコマンドラインインターフェイスで規定されており、初期の UNIX アプリケーションによって確立された長年の慣習です。
Bashでのオプション解析
Bashでオプションを解析する方法は、シェルスクリプトに渡されたすべての引数をループして、それがオプションかどうかを判断し、次の引数に移るというものです。この処理をオプションがなくなるまで繰り返します。
#!/bin/bashwhile [ True ]; doif [ "$1" = "--alpha" -o "$1" = "-a" ]; thenALPHA=1shift 1breakecho $ALPHA
このコードでは、すべての引数を処理するまでループし続けるwhileループを作成しました。if文は、最初の位置で見つかった引数を--alphaまたは-aでマッチさせようとします。
shiftキーワードは、すべての引数を1ビットずつシフトさせ、2番目の引数を1番目の引数に移動させます。
スクリプトの最後には、$ALPHA 値がターミナルに出力されます。
このスクリプトをテストしてください。
$ bash ./test.sh --alpha$ bash ./test.sh$ bash ./test.sh -a
ご覧の通り、オプションは正しく検出されています。
Bashでのパラメータ検出
しかし、上記のスクリプトにはもう一つ問題があります。
$ bash ./test.sh --alpha foo
オプション名以外のパラメータを取得するには、残りのパラメータを Bash 配列 ダンプします。
#!/bin/bashwhile [ True ]; doif [ "$1" = "--alpha" -o "$1" = "-a" ]; thenALPHA=1shift 1breakecho $ALPHAARG=( "${@}" )for i in ${ARG[@]}; doecho $i
新しいバージョンのスクリプトをテストしてください:
$ bash ./test.sh --alpha foo$ bash ./test.sh foo$ bash ./test.sh --alpha foo bar
を参照してください。
パラメータを渡す必要があるオプションは数多くあります。例えば、ユーザーが色やグラフィックスの解像度などのプロパティを設定できるようにしたり、アプリケーションにカスタムプロファイルを指定したりすることができます。
Bashでこれを行うには、ブールスイッチのようにshiftキーワードを使用することはできますが、引数を1つではなく2つシフトする必要があります。
#!/bin/bashwhile [ True ]; doif [ "$1" = "--alpha" -o "$1" = "-a" ]; thenALPHA=1shift 1elif [ "$1" = "--config" -o "$1" = "-c" ]; thenCONFIG=$2shift 2breakecho $ALPHAecho $CONFIGARG=( "${@}" )for i in ${ARG[@]}; doecho $i
このコードでは、elif句を追加して、各パラメーターを-configと-cと比較しています。もし一致すれば、CONFIGという変数の値が次の引数の値に設定されます。すべての引数は、-configまたは-cをスキップするために1つ、その引数をスキップするために1つ、合計2ビットずつシフトされます。前のセクションと同様に、ループはマッチする引数がなくなるまで繰り返されます。
新しいバージョンのスクリプトのテストです:
$ bash ./test.sh --config my.conf foo barmy.conf$ bash ./test.sh -a --config my.conf bazmy.conf
Bashはオプションの解析を簡単にします。
Bashでオプションを解析する方法は他にもあります。case文やgetoptコマンドを代わりに使うこともできます。どの方法であれ、ユーザーにオプションを与えることはアプリケーションの重要な機能です。





