Loop para continuar pedindo o valor até que o usuário insira valor exclusivo

1

Estou criando um script para tarefas automatizadas sobre o LVM. No script, quero que o usuário insira o nome do VG e ele deve ser exclusivo. Como criar um loop para que, se o usuário inserir um nome VG que já existe no sistema, ele não avance e continue pedindo o nome VG até que seja exclusivo.

A função que estou usando para criação de VG é mencionada abaixo:

vg_create(){
        printf "\n"
        printf "The list of volume groups in the system are: \n"
        vgs | tail -n+2 | awk '{print $1}'

        printf "\nThe list of Physical Volumes available in the OS are as follows: \n"
        view_pvs  ## Calling another function
        printf "\n"
        printf "[USAGE]: vgcreate vgname pvname\n"
        read -p "Enter the name of the volume group to be created: " vgname
        printf "\n"

        vg_match='pvs | tail -n+2 | awk '{print $2}' | grep -cw $vgname'

                if [ $vg_match -eq 1 ]; then
                   echo -e "${vgname} already exists. Kindly enter new name.\n"
                else
                   echo -e "${vgname} doesn't exist in system and will be created.\n"
                fi
        read -p "Enter the name of the physical volume on which volume group to be created: " pv2_name
        printf "\n"
        vgcreate ${vgname} ${pv2_name}

        printf "\n"
        printf "The new list of volume groups in the system are: \n"
        vgs | tail -n+2 | awk '{print $1}'
}
    
por Vivek Dabas 03.07.2018 / 16:56

2 respostas

3

Em geral:

# loop until we get correct input from user
while true; do
    # get input from user

    # check input

    # break if ok
done

Ou, um pouco mais detalhado:

# loop until we get correct input from user
while true; do
    read -r -p "Give your input: " answer

    # check $answer, break out of loop if ok, otherwise try again

    if pvs | awk 'NR > 2 {print $2}' | grep -qw -e "$answer"; then
        printf '%s already exists\n' "$answer" >&2
    else
        break
    fi
done

Nota: não tenho ideia do que pvs faz.

    
por 03.07.2018 / 17:05
1

Veja duas maneiras diferentes de verificar a existência de um VG:

  1. tenta ler diretamente o VG vgs --readonly "$vgname" ; se esse comando for bem-sucedido, o VG já existe.
  2. Se o vgname estiver listado na saída de vgs , o VG já existe.

Observe que o segundo método solicita especificamente vgs a não imprimir o cabeçalho e imprimir apenas o campo de nome VG. O nome é (no meu sistema) muitas vezes impresso com espaços à esquerda e à direita, e é por isso que a expressão grep parece da maneira como funciona.

read -p "Enter the name of the volume group to be created: " vgname
while vgs --readonly "$vgname" > /dev/null 2>&1
do
  read -p "Enter the name of the volume group to be created: " vgname
  if vgs --noheadings -o vg_name | grep -q "^ *${vgname} *\$"
  then
    printf "That VG name is already taken; try something else\n" >&2
  fi
done
    
por 03.07.2018 / 17:15

Tags