次の関数があります。これを使用してオプションの値にオプションを設定する方法を知りたいですgetopt
。
-w
デフォルト値を使いたいです。
region -w -- "Text"
これには-w 1
オプションの数値が必要です。
region -w 1 -- "Text"
ここで機能
region ()
{
# Process command line options
shortopts="hw::"
longopts="help,version,warning:"
opts=$(getopt -o "$shortopts" -l "$longopts" \
-n "$(basename $0)" -- "$@")
if [ $? -eq 0 ]; then
eval "set -- ${opts}"
while [ $# -gt 0 ]; do
case "$1" in
-h|-\?|--help)
printf "%s\n" "Todo."
shift
break
;;
-w|--warning)
case "$2" in
"1") local -r warn="first"; shift 2 ;;
*) local -r warn="all"; shift 2 ;;
esac
local -r f=1
;;
--)
local -r f=1
shift
break
;;
esac
done
else
shorthelp=1 # getopt returned (and reported) an error.
fi
}
答え1
おそらく、この答えは気に入らないでしょう。オプションで引数を取るオプションに引数を指定するには、スペースを使用できません。
$ getopt -o 'w::' -- -w -- arg
-w '' -- 'arg'
$ getopt -o 'w::' -- -w 1 -- arg
-w '' -- '1' 'arg'
$ getopt -o 'w::' -- -w1 -- arg
-w '1' -- 'arg'
同様に、オプションの長い引数の場合は、以下を使用する必要があります。=
$ getopt -o '' -l 'warning::' -- --warning -- arg
--warning '' -- 'arg'
$ getopt -o '' -l 'warning::' -- --warning 1 -- arg
--warning '' -- '1' 'arg'
$ getopt -o '' -l 'warning::' -- --warning=1 -- arg
--warning '1' -- 'arg'
マニュアルページから:
単純な短いオプションは、「-」の後に短いオプション文字が続くことです。 [...]オプションにオプションの引数がある場合オプション文字の直後に書く必要があります。存在する場合。
長いオプションは通常「--」で始まります。 [...]オプションにオプションの引数がある場合長いオプション名の直後に作成し、「=」で区切る必要があります。、存在する場合(「=」を追加し、その後に何も追加しない場合は、パラメータがないように解釈されます。これはマイナーなバグです。バグを参照してください。)
コードレイアウトのコードレビューの説明。 if-else-fi構文では、短い四半期を最初に配置してください。ここに到着したら、状況が何であるかをelse
覚えるためにスキャンする必要があります。if
これにより、「アサーション」スタイルで作成し、関数の「メイン」コードを減らすことができます。
region ()
{
# Process command line options
shortopts="hw::"
longopts="help,version,warning:"
opts=$(getopt -o "$shortopts" -l "$longopts" \
-n "$(basename $0)" -- "$@")
if [ $? -ne 0 ]; then
shorthelp=1 # getopt returned (and reported) an error.
return
fi
eval "set -- $opts"
# ...
または、終了ステータスを直接確認し、まだ変数に割り当てることができます。 (ここではデフォルトの名前呼び出しも削除しました。)
if ! opts=$(getopt -o "$shortopts" -l "$longopts" -n "${0##*/}" -- "$@")
then
shorthelp=1 # getopt returned (and reported) an error.
return
fi
-wを使用してlevel = 1を設定しました。それ以外の場合は、-wNUMにlevel = NUMを設定します。
local level=0
#...
case "$1" in
-w|--warning)
level=${2:-"1"}
;;
つまり、${var:-default}
パラメータ拡張の形式です。