Campo de opção alternativo

0

Em um script, tenho uma lista de opções que precisam ser inseridas pelo usuário.

Eles são

-c cell name - > deve estar lá

-n node - > deve estar lá

-s server - > deve estar lá

Suba aqui tudo bem meu código até aqui parece while getopts c:n:s:

O problema começa daqui,

Eu tenho dois outros campos que precisam ser inseridos em uma e / ou condição.

-i initial heap size

-m max heap size

O usuário insere essas duas opções ou qualquer uma delas.

Atualmente, tenho algo parecido com

#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

Como posso implementar o recurso e / ou a opção -i e -m ?

    
por debal 25.03.2014 / 08:37

2 respostas

1

Sua variável $flag é redundante - você a configura e depois a testa imediatamente. Você poderia apenas ecoar em vez de configurá-lo originalmente. Então a lógica é:

  • capture opts / opções
  • verifique se CELL, NODE e SERVER estão definidos
  • verifique se INI_HEAP ou MAX_HEAP está definido e é um 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
    
por 25.03.2014 / 12:49
0

Eu adicionaria valores padrão para INI_HEAP e MAX_HEAP antes do segmento de caso getopts. O padrão pode ser um valor codificado ou algum tipo de valor inteligente que primeiro analisa quanto o sistema tem memória e fornece um valor percentual como padrão.

    
por 25.03.2014 / 10:07

Tags