Bash Shell 脚本选项处理:添加 -all 和 -q(quiet),强制不重复

Bash Shell 脚本选项处理:添加 -all 和 -q(quiet),强制不重复

我正在编写一个 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..

相关内容