2011-09-23 5 views
8

例:bashでは、どのように任意の順序で引数を設定できますか?キーと値のペアと同じですか?

./myscript --ip 192.168.1.1 --port 1985 

または私は私のスクリプトは、引数のセットを取ることができるようにしたい

./myscript --port 1985 --ip 192.168.1.1 

別の可能性のある、任意の順序

./myscript a b c d 
./myscript d c b a 
./myscript b d a c 

で等電報

+0

は、IPとポートが単一の引数で指定されている: '192.168.1.1:1985'は – mouviciel

+0

@mouviciel私は同意するだろうが、これはデモの目的のためだけです – stackoverflow

答えて

10

getopts

getoptsはを見てみましょう。

Getoptsは、オプションとして位置パラメータ を解析するためにシェルプロシージャによって使用されます。

OPTSTRINGには、認識されるオプション文字が含まれています。 の後にコロンが続く場合、このオプションには空白で区切られた という引数が必要です。

、それが呼び出されるたびに、getoptsは、次の引数のインデックスはシェル 変数OPTINDに加工するために、それが存在しない場合は名前を初期化し、 シェル変数$名の次のオプションを置き、 ます。 OPTINDはシェルのたびに1に、または シェルスクリプトが呼び出されるたびに初期化されます。オプションに引数が必要な場合、 getoptsは、その引数をシェル変数OPTARGに置きます。

getoptsは、2つの方法のいずれかでエラーを報告します。 OPTSTRINGの最初の文字 がコロンの場合、getoptsはサイレントエラー報告を使用します。 このモードでは、エラーメッセージは表示されません。無効なオプションが である場合、getoptsは見つかったオプション文字をOPTARGに置きます。 必須の引数が見つからない場合、getoptsはNAMEに ''を、そして見つけたオプション文字に をOPTARGに設定します。 getoptsがサイレントモードの になく、無効なオプションが見つかると、getoptsは '?' NAMEには に、OPTARGにはOPTARGが設定されていません。必要な引数が見つからない場合は ' ' はNAMEに、OPTARGは設定されていません。診断メッセージは と表示されます。

シェル変数OPTERRが値0を持っている場合は、getoptsが optstringの最初の文字がコロンでなくても、エラーメッセージの 印刷を無効にします。 OPTERRのデフォルト値は1です。

Getoptsは通常、位置パラメータ($ 0 - $ 9)を解析しますが、さらに多くの引数が与えられた場合は、代わりに解析されます。

終了ステータス
オプションが見つかると成功します。オプションの末尾に があるか、エラーが発生した場合は失敗します。

7

getoptsを使用すると、コマンドライン引数を解析できます。 This tutorialは非常に便利です。名[引数]
解析オプションの引数をoptstringにgetoptsは:

3

この単純なスクリプトでは、pのポート番号とiパラメータのipアドレスを使用します。

 
while getopts "i:p:" option; do 
    case $option in 
    i) ip_address=$OPTARG 
    echo "ip address: $ip_address" 
    ;; 
    p) port_number=$OPTARG 
    echo "port number: $port_number" 
    ;; 
    esac 
done 

は、いずれかの方法で実行することができます

./myscript -i 192.168.1.1 -p 1985

または

./myscript -p 1985 -i 192.168.1.1

それを実行し印刷します。

 
ip address: 192.168.1.1 
port number: 1985 
getoptsははGNUスタイルの長いオプション(--myoption)またはXF86スタイルの長いオプション(-myoption)

を解析することができないことをhttp://wiki.bash-hackers.org/howto/getopts_tutorial

ノートで述べたようにも

だから、あなたがすることはできません長い文字列を--portまたは--ipと直接使用すると、getoptsとなります。このリンクで説明したように利用できる しかし、追加の回避策:通常
http://www.bahmanm.com/blogs/command-line-options-how-to-parse-in-bash-using-getopt

関連する問題