Como repetir o prompt para o usuário em um script de shell?

4

Em um conjunto de if / elif / else / fi, fiz 'else' apresentar ao usuário uma mensagem de erro, mas também quero que o usuário retorne à pergunta que foi feita antes do if / senhas, para que eles possam tentar respondê-lo novamente.

Como faço para levar o usuário de volta a uma linha de código anterior? Ou, se isso não for possível, há outra maneira de fazer isso?

    
por Kaiylar 09.03.2016 / 22:52

2 respostas

5

Acho que a maneira mais fácil seria colocar o código em uma função e, em seguida, soltá-lo em um loop until .

Já que tudo que você precisa é chamar a função até conseguir, você pode colocar o comando noop " : " no loop until.

Algo parecido com isto:

#!/bin/bash

getgender() {
  read -p "What is the gender of the user? (male/female): " gender
  case "$gender" in
    m|M)
      grouptoaddto="boys"
      return 0
      ;;
    f|F)
      grouptoaddto="girls"
      return 0
      ;;
    *)
      printf %s\n "Please enter 'M' or 'F'"
      return 1
      ;;
  esac
}

until getgender; do : ; done
sudo usermod -a -G "$grouptoaddto" "$username"

O ponto aqui é a função chamada com until , então é repetidamente chamada até que tenha sucesso. A chave de caixa dentro da função é apenas um exemplo.

Exemplo mais simples, sem usar uma função:

while [ -z "$groupname" ]; do
  read -p "What gender is the user?" answer
  case "$answer" in
    [MmBb]|[Mm]ale|[Bb]oy) groupname="boys" ;;
    [FfGg]|[Ff]emale|[Gg]irl) groupname="girls" ;;
    *) echo "Please choose male/female (or boy/girl)" ;;
  esac
done
sudo usermod -a -G "$groupname" "$username"

Neste último exemplo, estou usando a opção -z para o comando [ (test), para continuar o loop contanto que a variável "groupname" tenha tamanho zero.

A palestra é o uso de while ou until .

Para traduzir este último exemplo em pseudocódigo legível:

While groupname is empty,

  ask user for gender.

  If he answers with one letter "m" or "B",
    or the word "Male" or "boy",
    set the groupname as "boys".

  If she answers with one letter "F" or "g",
    or the word "female" or "Girl",
    set the groupname as "girls".

  If he/she answers anything else, complain.

(And then repeat, since groupname is still empty.)

Once you have groupname populated,
  add the user to that group.

Ainda outro exemplo, sem a variável groupname :

while true; do
  read -p "What gender is the user?" answer
  case "$answer" in
    [MmBb]|[Mm]ale|[Bb]oy)
      sudo usermod -a -G boys "$username"
      break
      ;;
    [FfGg]|[Ff]emale|[Gg]irl)
      sudo usermod -a -G girls "$username"
      break
      ;;
    *) echo "Please choose male/female (or boy/girl)" ;;
  esac
done
    
por 09.03.2016 / 23:02
2
flag=1
while [ ${flag} -eq 1 ]
do
  read -p "Please answer B or G " bg
  if [ "${bg}" = B ] || [ "${bg}" = b ] 
  then
    flag=0
    groupname=boys
  else 
    if [ "${bg}" = G ] || [ "${bg}" = g ]
    then
      flag=0
      groupname=girls
    fi
  fi
done
sudo usermod -a -G ${groupname} $username

essa é a maneira mais simples de pensar, mostrando claramente o que está acontecendo.

    
por 09.03.2016 / 23:46