스크립트에는 사용자 입력이 필요한 옵션 목록이 있습니다.
그들은
-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 사례 섹션 앞에 INI_HEAP 및 MAX_HEAP에 대한 기본값을 추가하겠습니다. 기본값은 하드코딩된 값이거나 먼저 시스템에 있는 메모리 양을 확인하고 기본값으로 백분율 값을 제공하는 일종의 스마트 값일 수 있습니다.