への各呼び出しはgetopts
常に「次の」オプションを処理するため ( を調べることで決定$OPTIND
)、while
-loop は必ずオプションを表示される順序で処理します。
-c
コマンドラインで他のオプションの後に表示されたとしても、他のオプションに部分的に取って代わられる必要があるため、いくつかの方法があります。
1 つは、オプションを2 回ループすることです。
#!/bin/bash
# ...
optstring='c:l:o:b:dehruwx'
while getopts "$optstring" OPTION
do
case $OPTION in
c)
echo "load"
CONFIG_FILE=$OPTARG
# load_config is a function that sources the config file
load_config $CONFIG_FILE
esac
done
OPTIND=1
while getopts "$optstring" OPTION
do
case $OPTION in
l)
echo "set local"
LOCAL_WAR_FILE=$OPTARG
;;
# ...
esac
done
shift $(($OPTIND - 1))
もう 1 つは、オーバーライドし-c
ない変数にオプションを保存してから、それらをコピーすることです。
#!/bin/bash
# ...
while getopts c:l:o:b:dehruwx OPTION
do
case $OPTION in
c)
echo "load"
CONFIG_FILE=$OPTARG
# load_config is a function that sources the config file
load_config $CONFIG_FILE
;;
l)
echo "set local"
LOCAL_WAR_FILE_OVERRIDE=$OPTARG
;;
# ...
esac
done
shift $(($OPTIND - 1))
LOCAL_WAR_FILE="${LOCAL_WAR_FILE_OVERRIDE-${LOCAL_WAR_FILE}}"
(または、逆に、構成ファイルで のようなオプションを設定できます。LOCAL_WAR_FILE_DEFAULT
次に、 と記述しLOCAL_WAR_FILE="${LOCAL_WAR_FILE-${LOCAL_WAR_FILE_DEFAULT}}"
ます。)
もう 1 つのオプションは、 が存在する場合、最初-c
に が来ることを要求することです。最初に自分で処理することでそれを行うことができます:
if [[ "$1" = -c ]] ; then
echo "load"
CONFIG_FILE="$2"
# load_config is a function that sources the config file
load_config "$CONFIG_FILE"
shift 2
fi
次に、メインwhile
ループで-c
、エラーメッセージを出力して処理します。
もう 1 つは、単に既存の動作を文書化し、それを「機能」と呼ぶことです。多くの Unix ユーティリティには、以前のオプションに取って代わる新しいオプションがあるため、この動作は実際には問題になりません。