可能的重复:
如何处理 shell 脚本中的开关?
最常见的 shell 命令允许用户以任意随机顺序指定选项。$1
另一方面,像 bash 中常用的位置参数(我倾向于在 Bash 中编写所有脚本,但我不认为这个问题实际上是 Bash 特定的)脚本是特定于顺序的。
现在我可以想出一些一种无需 bash 脚本用户在提供可选参数时遵守任何特定顺序的方法。 (我想到了使用正则表达式或全局变量来测试扩展中是否存在某些特定选项$@
。)但是,我真的想找出是否有一种特别规范的方法来实现此类选项。考虑到选项的通用语法(例如-r
许多 shell 命令),我当然认为应该有。
答案1
getopt
并getopts
支持给定参数的任何顺序 - 它们易于使用,并且似乎是参数解析的规范解决方案。
经常提到的两个区别:
getopt
支持长选项,例如--help
.getopts
是一个内置的 Bash shell,而不是一个独立的程序。
简化 广泛例子:
# 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