Como posso sair de um loop while, de dentro de uma instrução de caso aninhado? [fechadas]


18

No script abaixo - que solicita ao usuário que confirme que deseja continuar com a execução de um script potencialmente ruim - quando o usuário digita Yno prompt - ele será interrompido case, apenas para ser enviado novamente ao whileloop.

#! /bin/bash
set -e

echo
echo "bad install start"
echo "-----------------------------------------"

while true; do
        read -p "this script will probably fail - do you want to run anyway?" yn
        case $yn in
                [Yy]*)
                        ##### WHAT GOES HERE?? #####
                        ;;
                [Nn]*)
                        exit ;;
                *)
                        echo "answer y or n" ;;
        esac

        echo "script has broken out of case back into while loop"
done

echo -e "\e[33m Installing bad packagename \e[0m"
apt-get install sdfsdfdfsd

echo "rest of script - will i keep running?"

Quando né inserido, o script existe inteiramente como desejado. Gostaria de saber como fazê-lo para que, quando Ydigitado, o script saia do bloco while case e do bloco while, mas não saia completamente. Existe algo que eu possa colocar para o espaço reservado ("O que se passa aqui ??") faça isso?


Note que primeiro [Yn]*); você provavelmente quis dizer [Yy]*).
dhag

1
Você editou seu código desde que eu respondi pela primeira vez, mas observe o que for $TEST=1necessário TEST=1, e é muito provável que seu script funcione com essa alteração.
Dhag

doh, sim eu vi isso ao testar!
The_velour_fog # 4/15

@ dhag Eu acho que melhorei sua edição - por favor, dê uma olhada. Parece que seu objetivo é reescrever o código em algo em que sua resposta aceita se encaixe bem, e acho que está mais perto agora.
Derobert 4/15

@derobert: Sua edição parece boa para mim; certamente torna a pergunta mais clara.
dhag

Respostas:


30

No caso em que o usuário digitou "y", você pode sair do while e do case:

break [n]
       Exit from within a for, while, until, or select loop.  If  n  is
       specified, break n levels.  n must be  1.  If n is greater than
       the number of enclosing loops, all enclosing loops  are  exited.
       The  return  value is 0 unless n is not greater than or equal to
       1.

No seu caso, você quer fazer break 2.


1
obrigado, sim break 2, com relação ao seu comentário acima, sim, tentei definir uma variável, mas não funcionou - acho que o bash tem escopo local nos blocos while e case? ao contrário, por exemplo, PHP
the_velour_fog

Não, as variáveis ​​bash não são locais (a menos que você as declare explicitamente), portanto, a atribuição a TEST dentro do caseque você fez deve ser refletida no teste do loop while.
dhag

ah entendi, eu estava realizando outra tarefa dentro do [Yy]bloco do caso. fiz uma pequena edição dentro da minha pergunta para refletir, mas seu direito funciona - obrigado, eu aprendi algumas coisas legais!
The_velour_fog 4/15

Nesse caso, breaké suficiente. Não vejo dois níveis de loops no código.
Xhienne 6/08

@xhienne: Você parece estar correto! Não tenho certeza do que estava pensando.
Dag

1

@ dhag tem uma ótima resposta. Você também pode usar:

a=0
while [ "$a" -eq 0 ]; do
     ...
     [Nn]*)
          a=1;
          ;;
      ...
done
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.