是否有一些内置工具可以将-x
和识别--xxxx
为开关,而不是参数,或者您是否必须遍历所有输入变量,测试破折号,然后解析参数?
答案1
我假设你正在使用 bash 或类似的。一个例子:
all=false
long=false
while getopts ":hal" option; do
case $option in
h) echo "usage: $0 [-h] [-a] [-l] file ..."; exit ;;
a) all=true ;;
l) long=true ;;
?) echo "error: option -$OPTARG is not implemented"; exit ;;
esac
done
# remove the options from the positional parameters
shift $(( OPTIND - 1 ))
ls_opts=()
$all && ls_opts+=( -a )
$long && ls_opts+=( -l )
# now, do it
ls "${ls_opts[@]}" "$@"
答案2
使用getopts
。
它是相当可移植的,因为它符合 POSIX 规范。不幸的是它不支持长选项。
另请参阅此getopts
教程由 bash-hackers wiki 和 this 提供问题来自堆栈溢出。
如果您只需要简短的选项,getopts
(使用非静默错误报告)的典型使用模式是:
# process arguments "$1", "$2", ... (i.e. "$@")
while getopts "ab:" opt; do
case $opt in
a) aflag=true ;; # Handle -a
b) barg=$OPTARG ;; # Handle -b argument
\?) ;; # Handle error: unknown option or missing required argument.
esac
done
答案3
您必须编写一个循环来解析参数。事实上,您可以使用getopts
命令轻松完成此操作。
getopts
这是手册页中的一个简单示例:
aflag=
bflag=
while getopts ab: name
do
case $name in
a) aflag=1;;
b) bflag=1
bval="$OPTARG";;
?) printf "Usage: %s: [-a] [-b value] args\n" $0
exit 2;;
esac
done
if [ ! -z "$aflag" ]; then
printf "Option -a specified\n"
fi
if [ ! -z "$bflag" ]; then
printf 'Option -b "%s" specified\n' "$bval"
fi
shift $(($OPTIND - 1))
printf "Remaining arguments are: %s\n" "$*"
答案4
我最近为工作编写了一个脚本,该脚本具有多种用途,并且允许按任何顺序进行多种切换。由于明显的法律原因,我无法透露完整的脚本(更不用说我现在没有它),但这是它的核心内容..你可以将它放在一个子例程中并在最后调用它你的脚本的:
options () {
if [ -n "$1" ]; then # test if any arguments passed - $1 will always exist
while (( "$#" )); do # process ALL arguments
if [ "$1" = ^-t$ ]; then # -t short for "test"
# do something here THEN shift the argument
# shift removes it from $@ and reduces $# by
# one if you supply no argument
shift
# we can also process multiple arguments at once
elif [[ "$1" =~ ^--test=[:alnum:]{1,8}$ ]] && [[ "$2" =~ ^-t2$ ]] && [[ -n "$3" ]]; then # check for 3 arguments
# do something more then remove them ALL from the arg list
shift 3
else
echo "No matching arguments!"
echo "Usage: [script options list here]"
fi
done
else
echo "Usage: [script options list here]"
exit 0
fi
}
options "$@" # run options and loop through/process ALL arguments
我确实建议将 bash 脚本限制为少于 400 行/15k 个字符;我前面提到的脚本超过了这个大小并且变得非常难以处理。我开始用 Perl 重写它,它更适合这项任务。当您在 bash 中处理脚本时请记住这一点。 Bash 非常适合小型脚本和单行代码,但任何更复杂的东西,你最好用 Perl 编写。
请注意,我还没有测试上述内容,因此它可能不起作用,但您可以从中了解总体思路。