我正在编写一个 Bash 脚本,它接受 N 个选项。将它们命名为 -1、-2、...、-N。以下内容适用于选项的使用:
- 可以提供任意数量的选项,从 0 到 N
- 任何选项均不接受任何参数
- 可以按任意顺序提供选项
我以一种相当标准的方式处理这些问题:
while [[ $# -gt 0 ]]
do
OPTION="$1"
case $OPTION in
-1)
process_option_1
shift
;;
-2)
process_option_2
shift
;;
...
-N)
process_option_N
shift
;;
*)
echo "Unknown option $OPTION. Aborting..."
exit 1
esac
done
目标 1
我想添加两个附加选项:
- -全部这意味着全部 -1, -2, ... -N
- -q这表示“安静”模式,即不打印任何内容到显示屏
如果-全部出现,它必须单独出现,或者与-q仅有的。
-q可以与“-全部“或“-1 -2 ... -N”调用形式。
目标 2
我想强制要求任何选择都不能重复。
问题
我很难扩展我的逻辑来实现我的目标。
我想问社区:我怎样才能实现这些目标?
请注意,目标 2 是次要的。如果有人对目标 1 有解决方案,但没有对目标 2 的解决方案,请务必提供!
编辑以添加:我可以强制执行逻辑;我的意思是说,我正在寻找一个干净,优雅的解决方案,它不涉及不必要的重复循环选项,可以自动将新单独选项的处理纳入-all等......
答案1
我认为这可行(没有测试过)。
# Use flags to set options on or off.
opt_1=0
opt_2=0
opt_N=0
opt_q=0
all=0
# Goal 2, make options unique.
set -- $(echo $@|tr ' ' '\n'|sort -u)
# Test for -q option.
if [[ "$@" =~ -q ]]; then
opt_q=1
set -- $(echo ${@/-q/})
fi
# Goal 1, -q already processed if present, see if -all is alone.
if [[ "$@" =~ -all ]] && [ "$#" -ne 1 ]; then
echo -all only by itself or with -q
exit
fi
while [ -n "$1" ]; do
case "$1" in
-1)opt_1=1;;
-2)opt_2=1;;
-N)opt_N=1;;
-all)all=1;;
esac
shift
done
if [ "$opt_q" -eq 1 ]; then
exec 1>/dev/null 2>&1
fi
if [ "$opt_1" -eq 1 ] || [ "$all" -eq 1 ]; then
# do stuff for -1
fi
..etc..