Como executar a operação “Yes / No” desde que eu pressione “Yes” no bash?

2

Suponha que eu tenha a construção Sim / Não no script bash:

read -r -p "Yes or no?" response
if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
 then 
 do ...
else
 exit 0
fi

Eu quero que esta construção seja executada até que eu pressione "não". Ou seja, se eu pressionar "Sim", após a finalização da operação "fazer ...", eu quero novamente "Sim ou não?" resposta.

    
por John Taylor 25.05.2016 / 11:49

2 respostas

4

Você precisa continuar pedindo uma resposta até que ela não seja a desejada:

while true;
do
    read -r -p "Yes or no? " response   
    if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
    then
        echo "You chose yes"
    else
        exit 0
    fi
done
    
por 25.05.2016 / 12:22
4

Use um loop while:

while
  read -r -p "Yes or no? " response &&
    [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
do
  ...
done

Ou para tornar esse código POSIX sh compatible, para que você não precise ter bash instalado:

while
   printf 'Yes or No? ' &&
     read answer
do
  case $answer in
    ([yY][eE][sS] | [yY]) ...;;
    (*) break;;
  esac
done

Observe que também verificamos um status de saída com falha de printf (que poderia sinalizar um cano quebrado) e read (que sinalizaria eof) como condições de saída do loop, como geralmente é o que você deseja.

No caso de bash ' read -p , o prompt será emitido pelo processo do shell, pois read é interno, portanto, o shell será eliminado quando o stdout se tornar um cano quebrado, mas por printf , se o shell ou apenas printf será eliminado dependerá da implementação de sh , pois nem todas as implementações têm printf incorporado. Talvez você também queira relatar o erro printf como um erro do seu script para ter consistência:

while
   printf 'Yes or No? ' || exit # with the exit status of printf
   read answer # eof not considered as an error condition
do
  case $answer in
    ([yY][eE][sS] | [yY]) ...;;
    (*) break;;
  esac
done
    
por 25.05.2016 / 13:39