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