重複の可能性:
シェルスクリプトでスイッチを処理する方法は?
最も一般的なシェルコマンドを使用すると、ユーザーは任意の順序でオプションを指定できます。$1
一方、bashで一般的に使用される位置パラメータ(私はすべてのスクリプトをBashとして書く傾向がありますが、この質問は実際にBashに固有のものではないと思います)のように、スクリプトは順序によって異なります。
今私は見つけることができます一部オプションの引数を指定するときに、bashスクリプトユーザーが特定の順序に従うように要求しない方法です。 (拡張子に特定のオプションがあるかどうかをテストするために正規表現またはグローバル変数を使用しようとしました$@
。)しかし、そのようなオプションを実装する特別な標準的な方法があるかどうかを知りたいです。オプションの共通構文(例:-r
多くのシェルコマンド)を考えると、明らかにする必要があると思います。
答え1
getopt
指定されたパラメータのすべての順序をサポートしますgetopts
。使いやすく、パラメータ解析のための標準的な解決策に見えます。
よく言及される2つの違いは次のとおりです。
getopt
長いオプションをサポートしています--help
。getopts
スタンドアロンプログラムではなく、組み込みのBashシェルです。
幅広い簡素化はい:
# Process parameters
params="$(getopt -o e:hv \
-l exclude:,help,verbose \
--name "$0" -- "$@")"
if [ $? -ne 0 ]
then
usage
fi
eval set -- "$params"
unset params
while true
do
case $1 in
-e|--exclude)
excludes+=("${2-}")
shift 2
;;
-h|--help)
usage
exit
;;
-v|--verbose)
verbose='--verbose'
shift
;;
--)
shift
if [ -z "${1:-}" ]
then
error "Missing targets." "$help_info" $EX_USAGE
fi
if [ -z "${2:-}" ]
then
error "Missing directory." "$help_info" $EX_USAGE
fi
targets=(${@:1:$(($#-1))})
source_dir="${@:$#}"
break
;;
*)
usage
;;
esac
done