如何选择需要另一个选项?

时间:2016-11-16 17:33:51

标签: bash shell sh getopt getopts

我正在创建一个接受选项的脚本,其中两个是-s-e-s需要一个开始日期和-e要求和结束日期,但我想这样做,以便在没有另一个的情况下不能使用它。换句话说,如果我使用-s选项,则还需要-e选项,反之亦然。

到目前为止,这是我的代码

#!/bin/bash

gflag=false
uflag=false
sflag=false
eflag=false
rflag=false
nflag=false
tflag=false

while getopts g:u:s:e:rnt opt; do
  case "$opt" in
    g)
      gflag=true
      groupParam=$OPTARG
      echo "-g was triggered, Parameter: $OPTARG" >&2
      ;;
    u)
      uflag=true
      userParam=$OPTARG
      echo "-u was triggered, Parameter: $OPTARG" >&2
      ;;
    s)
      sflag=true
      startParam=$OPTARG
      echo "-s was triggered, Parameter: $OPTARG" >&2
      ;;
    e)
      eflag=true
      endParam=$OPTARG
      echo "-e was triggered, Parameter: $OPTARG" >&2
      ;;
    r)
      rflag=true
      echo "-r was triggered" >&2
      ;;
    n)
      nflag=true
      echo "-n was triggered" >&2
      ;;
    t)
      tflag=true
      echo "-t was triggered" >&2
      ;;
  esac
done

如何更改代码才能执行此操作?

1 个答案:

答案 0 :(得分:1)

在解析所有选项后(while循环之后),您可以执行

if ($sflag && ! $eflag) || (! $sflag && $eflag); then
    echo "Cannot specify -s without -e or vice versa" >&2
    exit 1
fi

我正在利用truefalse是内置命令返回预期状态的事实。

也可以在不使用子shell的情况下编写它,但它有点吵闹:

if { $sflag && ! $eflag; } || { ! $sflag && $eflag; }; then