在脚本中,我有一个需要用户输入的选项列表。
他们是
-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 的默认值。默认值可以是硬编码值,也可以是某种智能值,它首先查看系统有多少内存,并给出一个百分比值作为默认值。