使用其他选项之一处理 Bash getopts 选项

Handle Bash getopts option with one of other options

我当前的 Bash 脚本如下所示。到目前为止,除了选项 -g 之外它都在工作。我希望这个选项是可选的,但没有 -c-n.

中的任何一个都不能使用它

所以我的意思是:

不幸的是,我不知道该怎么做。

while getopts ':cniahg:' opt; do
  case $opt in
  g) DAYS_GRACE_PERIOD=$OPTARG ;;
  c) prune_containers ;;
  i) prune_images ;;
  n) prune_networks ;;
  a)
    prune_containers
    prune_networks
    prune_images
    ;;
  :) echo "Invalid option: $OPTARG requires an argument" 1>&2 ;;
  h) print_usage ;;
  \?) print_usage ;;
  *) print_usage ;;
  esac
done
shift $((OPTIND - 1))

-g option to be optional but it cannot be used without any of -c or -n.

在变量中存储选项 c,在另一个变量中使用选项 n,在另一个变量中使用选项 g。解析选项后,使用变量检查条件。

g_used=false c_used=false n_used=false
while .....
   g) g_used=true; ...
   c) c_used=true; ...
   n) n_used=true; ...
....

# something like that
if "$g_used"; then
    if ! "$c_used" || ! "$n_used"; then
      echo "ERROR: -g option was used, but -c or -n option was not used"
    fi
fi

# ex. move the execution of actions after the option parsing
if "$c_used"; then
    prune_containers
fi
if "$n_used"; then
    prune_networks
fi

看起来你的循环执行带有解析参数的动作。在您的解析选项循环中,您可以只设置与每个选项关联的变量,然后在循环之后根据 "state of all options" 执行操作。在循环之后,因为那时您将拥有所有使用的选项的 "global" 视图,所以基于多个标志的解析和决策会更容易。