2016-06-29 8 views
2

別のコマンドに区切り文字の後にすべての引数を渡す引数の一つは、私が--前に引数を使用したい場合には--、でない限り、私のスクリプトでは、--の後の引数だけを渡します。は、私が別のコマンドにシェルスクリプトから<em>すべて</em>引数に渡したい

は例えば、私のスクリプトはfoo.shの場合:

./foo.sh -a bar -p qux -- --recursive -p 8080 

私は私のスクリプトで-aと最初-p引数を使用し、--recursive-p第二に合格したいと思います。

--が発見されるまで、私の最初のアイデアは、その後、その後[email protected]で他のコマンドに残りを渡し、私が欲しいの引数を抽出するためにshiftを使用し、各引数の上に最初の反復するためにですが、私はより多くのがある願っていますこれを行うエレガントな方法。

私は現在、引数を抽出するためにgetoptsを使用しています。そのため、それを使用するソリューションが最適になります。

答えて

6

GNU manualから抜粋した簡略化した例です。

#!/bin/bash 
aflag= 
bflag= 
cflag= 
dflag= 
while getopts abcd name 
do 
    case $name in 
    a) aflag=1;; 
    b) bflag=1;; 
    c) cflag=1;; 
    d) dflag=1;; 
    esac 
done 

shift $(($OPTIND - 1)) 
printf "Remaining arguments are: %s\n" "$*" 

結果completness

のためのマニュアルの

$ ./test.sh -a -b -- -c -d 
Remaining arguments are: -c -d 

関連部品、それが呼び出されるたびに、getoptsはユーティリティは、の次のオプションの値を配置するものnameオペランドで指定されたシェル変数と、シェル変数OPTINDで処理される次の引数のインデックス。シェルが起動されるたびに、OPTINDは1に初期化されなければならない

[...]

オプションの終わりが検出され

、ゼロより大きい戻り値で終了するものとgetoptsはユーティリティ。シェル変数OPTINDは、最初の非オプション引数のインデックスに設定されます。最初の " - "引数は、その前に他の非オプション引数がない場合はオプション引数とみなされます。非オプション引数がない場合は値 "$#" +1、 name変数は疑問符文字に設定されます。以下のいずれかは、オプションの終わりを識別しなければならない:特別なオプション " - "で始まり、 ' - 'で始まらない引数を見つけるか、エラーに遭遇する。

+0

完璧な、これは私が望むようにほぼ正確に動作します。 '--'が渡されなければ正しく動作しませんが、' --'が引数リストにある場合に 'getopts'ループを実行するだけで解決します。ありがとう! –

関連する問題