
test.sh
次のようにシェルスクリプトを呼び出す必要があります。
./test.sh -run/-rerun username password
シェルスクリプトから渡されたオプション-run
やオプションがあるかどうかを確認できますか?-rerun
答え1
一般的なアプローチは次のとおりです。getopt
より簡単な解析のためにスクリプトに渡されたコマンドラインオプションを分析するユーティリティです。getopt
パラメータの有無にかかわらず、短い(単一文字)および長い(多文字)オプションをサポートします。getopt
呼び出し時に2つの引数が渡されます。getopt
オプションの解析方法を変更するオプションと、解析する呼び出しスクリプトの引数。
残りの引数を解析する方法を指定する最も重要なオプションgetopt
は次のとおりです。
-o, --options shortopts
解析する短いオプションです。このオプションの引数はshortopts
文字列であり、短いオプションとして認識する必要があります。必須パラメーターを持つオプション文字の後にはコロンが続く必要があり、オプションのパラメーターを持つオプション文字の後には2つのコロンが続く必要があり:
ます::
。たとえば、このshortopts
文字列はab:c::
次の認識されたオプションに-a
対応し-b arg
ます-c
。-c arg
このオプションを指定しないと、次に始まらgetopt
ない(オプション引数でもない)最初のオプションが文字列として扱われます。-
shortopts
-l, --longoptions longopts
解析する長いオプションです。オプション名をカンマで区切って複数のオプションを一度に指定したり、-l
オプションを複数回指定したりできます。必須およびオプションのパラメータは、オプション名の後または後にオプションとして-o
表示されます。:
::
-a, --alternative
共同合意、特に牛に似た一種の栄養ソフトウェアの1つの欠点は、長いオプションの前に2つのダッシュ(たとえば)が付いていることです--run
。この-a
オプションは、getopt
長いオプションが-
単一文字で始まることができることを示します。-q,--quiet
getopt
認識できないオプションを検出したり、解析する引数の中に必須の引数が欠落している場合、またはgetopt: unrecognized option '[option name]'
togetopt: option '[option name'] requires an argument
形式のメッセージを出力し、stderr
通常の出力を生成してstdout
ゼロ以外の状態で終了します。この-q
オプションを使用すると、エラーメッセージが表示されないことがあります。-n, --name progname
getopt
このオプションを使用すると、上記のエラーを報告するときに使用するプログラム名を指定できます。
オプションではない最初の引数(オプション引数ではないか、上記のようにshortopts
文字列として扱われます)は、getopt
解析する引数リストの先頭と見なされます。これらのパラメータの先頭はとしてマークすることもできます。--
この場合、最初の次のパラメータは解析する--
パラメータリストの先頭と見なされます。
の一般的な出力は、getopt
次のように認識されたオプションの拡張リストです。
付属の短いオプション(例:)は
-abc
別のオプションに拡張されます-a -b -c
。単一のダッシュで始まる長いオプション(たとえば)
-a
では、オプションとして指定されている場合は追加のダッシュが前に付けられます。つまり、getopt
-foo
--foo
オプションの必須パラメータとオプションパラメータは引用符で囲まれています(例:
-b arg
goesとbe)。-b 'arg'
--foo arg
--foo=arg
--foo 'arg'
残りのパラメータは引用符で囲まれ、optionsと区別されます
--
。
拡張の利点は、考慮すべき状況が少ないため、分解されたオプションを解析する方が簡単です。getopt
質問で指定されたコマンドラインオプションを使用して解析された例は次のとおりです。
#!/bin/bash
OPTS=`getopt -a -l run -l rerun -- "$0" "$@"`
if [ $? != 0 ] # There was an error parsing the options
then
exit 1
fi
eval set -- "$OPTS"
while true; do
case "$1" in
--run) echo "option --run specified"; shift;;
--rerun) echo "option --rerun specified"; shift;;
--) shift; break;;
esac
done
echo "Args:"
for arg # Process remaining arguments
do
echo $arg
done
説明する:
OPTS=`getopt -a -l run -l rerun -- "$0" "$@"`
OPTS
ここでは、呼び出しの出力を保持する変数を設定しますgetopt
。この場合、ここに渡されるパラメータはgetopt
シェルによって設定された組み込み変数です。スクリプト名をbash
保存し、スクリプトに渡されたすべてのコマンドライン引数(個別に引用)を保存します。引数は指定されたオプションに従って処理されます。この例では、パラメータのない長いオプションが認識されます。このオプションはテーブルと。呼び出しの結果は拡張パラメータのリストです。たとえば、などのスクリプト呼び出しはシェルによる呼び出しに拡張されます。拡張パラメータは順番に出力されます。$0
$@
getopt
getopt
--run
--rerun
-a
getopt
-run
-rerun
getopt
test.sh -run username password
getopt
getopt -a -l run -l rerun -- "test.sh" "-run" "username" "password"
getopt
--run -- 'username' 'password'
if [ $? != 0 ] # There was an error parsing the options
then
exit 1
fi
組み込み変数は、$?
最後に実行されたコマンドの戻り値を保持します。ゼロ以外の戻り値は、getopt
エラーが発生したことを示します。
eval set -- "$OPTS"
これは実際にスクリプトに渡された元のコマンドライン引数をから出力された拡張引数に置き換えますgetopt
。
while true; do
case "$1" in
--run) echo "option --run specified"; shift;;
--rerun) echo "option --rerun specified"; shift;;
--) shift; break;;
esac
done
$1
ループは最初の位置引数から始まり、各位置引数を順番に処理します。拡張後、getopt
3つのケースを考慮するだけです。処理が終わると、各ケースは、などの位置shift
パラメータを変更します。したがって、位置パラメータはループが繰り返されるたびに新しい値を保持します。$2
$1
$3
$2
$1
処理中のオプションに必須パラメーターが必要な場合は、case
位置パラメーターを使用してステートメントからパラメーター値にアクセスできます$2
。オプションとその引数が処理されたときに両方のオプションを削除するには、位置パラメータを2だけ移動する必要があります。そして議論。
a が認識されたオプションの後、残りの引数の前に出力される場合getopt
、ケースはオプションリストの終わりとループの終了条件を示します。--
--
while
echo "Args:"
for arg # Process remaining arguments
do
echo $arg
done
for arg
うん、短縮for arg in "$@"
。while
ループ後、shift
各ケースの結果、出力$@
後半の残りのパラメータのみが保存されます。--
getopt