대체 옵션 필드

대체 옵션 필드

스크립트에는 사용자 입력이 필요한 옵션 목록이 있습니다.

그들은

-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에 대한 기본값을 추가하겠습니다. 기본값은 하드코딩된 값이거나 먼저 시스템에 있는 메모리 양을 확인하고 기본값으로 백분율 값을 제공하는 일종의 스마트 값일 수 있습니다.

관련 정보