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


0

我正在编写一个带有N个选项的Bash脚本。称它们为-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

我想添加两个额外的选项:

  • -all这意味着-1,-2,... -N的全部
  • -q这表示“安静”模式,即不向显示器打印任何内容

如果出现-all,则它必须单独出现或仅出现-q

-q可以与“ -all ”或“-1 -2 ... -N”形式的调用一起使用。

目标2

我想强制执行,不能重复任何选项。

我很难扩展我的逻辑以实现我的目标。

我想问社区:我怎样才能实现这些目标?

请注意,目标2是次要的。如果某人有目标1的解决方案而不是目标2的解决方案,请务必提供!

编辑补充:我可以强制逻辑; 我的意思是说,我正在寻找一个干净,优雅的解决方案,不涉及对选项的不必要的重复循环,提供自动将新的个别选项的处理包含到-all等...

Answers:


0

我认为这可以工作(没有测试)。

# 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..
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.