备用选项字段

备用选项字段

在脚本中,我有一个需要用户输入的选项列表。

他们是

-c cell name-> 它必须在那里

-n node-> 它必须在那里

-s server-> 它必须在那里

直到这里一切都很好我的代码直到这里看起来像while getopts c:n:s:

问题就从这里开始

我还有另外两个字段需要在和/或条件中输入。

-i initial heap size

-m max heap size

用户输入这两个选项或其中之一。

目前我有类似的东西

#get the arguments -c for cell, -n for node, -s for server, -i for initial heap, -m for max heap
while getopts c:n:s:im opt; do
        case $opt in
          c)
                CELL=$OPTARG
                ;;
          n)
                NODE=$OPTARG
                ;;
          s)
                SERV=$OPTARG
                ;;
          i)
                INI_HEAP=$OPTARG
                ;;
          m)
                MAX_HEAP=$OPTARG
                ;;
          ?)
                echo "a.sh -c <CELL> -n <NODE> -s <SERVER> [-i <INITAIL HEAP> | -m <MAX HEAP>"
                ;;
        esac
done

#test if cell name is not null
if ! test "$CELL" || ! test "$NODE" || ! test "$SERV" ; then
        echo "a.sh -c <CELL> -n <NODE> -s <SERVER> [-i <INITAIL HEAP> | -m <MAX HEAP>]"
        exit 1
fi

#test if both initial heap and max heap are null
flag=0
if ! test "$INI_HEAP" ; then
        if ! test "$MAX_HEAP" ; then
                flag=1;
        fi
fi

if [[ $flag -eq 1 ]] ; then
        echo "flag a.sh -c <CELL> -n <NODE> -s <SERVER> [-i <INITAIL HEAP> | -m <MAX HEAP>]"
        exit 1
fi

#test for non numeric value of initial heap size
if [[ "$INI_HEAP" == +([0-9]) ]] ; then
        continue
else
        echo "num a.sh -c <CELL> -n <NODE> -s <SERVER> [-i <INITAIL HEAP> | -m <MAX HEAP>]"
        exit 1
fi

我怎样才能实现和/或功能-i-m选项。

答案1

您的$flag变量是多余的 - 您设置它,然后立即测试它。您可以只回显而不是最初设置它。所以逻辑是:

  • 捕获选项/optargs
  • 确保 CELL、NODE 和 SERVER 均已设置
  • 确保设置了 INI_HEAP 或 MAX_HEAP,并且是 int
#get the arguments -c for cell, -n for node, -s for server, -i for initial heap, -m for max heap
while getopts c:n:s:i:m: opt; do
        case $opt in
          c)
                CELL=$OPTARG
                ;;
          n)
                NODE=$OPTARG
                ;;
          s)
                SERV=$OPTARG
                ;;
          i)
                INI_HEAP=$OPTARG
                ;;
          m)
                MAX_HEAP=$OPTARG
                ;;
          ?)
                echo "Usage: a.sh -c <CELL> -n <NODE> -s <SERVER> [-i <INITIAL HEAP> | -m <MAX HEAP>]"
                exit 1
                ;;
        esac
done

#test if cell name is not null
if [[ -z "$CELL" || -z "$NODE" || -z "$SERV" ]]; then
    echo "Cell, Node and Server are mandatory values"
    echo "Usage: a.sh -c <CELL> -n <NODE> -s <SERVER> [-i <INITIAL HEAP> | -m <MAX HEAP>]"
    exit 1
fi

#make sure either -i or -m was used (or both) and is an integer
shopt -s extglob
if [[ ( -z "$INI_HEAP" && -z "$MAX_HEAP" ) || -n "${INI_HEAP##+([0-9])}" || -n "${MAX_HEAP##+([0-9])}" ]]; then
    echo "Initial heap size or maximum heap size (or both) must be specified, and must be an integer"
    exit 1
fi
shopt -u extglob

答案2

我会在 getopts case 段之前添加 INI_HEAP 和 MAX_HEAP 的默认值。默认值可以是硬编码值,也可以是某种智能值,它首先查看系统有多少内存,并给出一个百分比值作为默认值。

相关内容