Como executar novamente a instrução case se a entrada for inválida? [duplicado]

5

Eu tenho o seguinte código no meio de um script para confirmar se queremos retomar o script ou não.

read -r -p "Would you like to continue  [Y/N] : " i
case $i in
        [yY])
                echo -e "Resuming the script";;
        [nN])
                echo -e "Skipped and exit script"
                exit 1;;
        *)
                echo "Invalid Option"
                ;;
esac

Gostaria de saber se existe alguma maneira de saber se existe alguma maneira de recuperar o caso de comutação se a opção de entrada for inválida?

    
por Kusalananda 03.09.2018 / 18:27

4 respostas

11

Faça sua entrada em um loop. Saia do loop com break (ou exit conforme o caso) se você obtiver uma resposta válida do usuário.

while true; do
    read -p 'Continue? yes/no: ' input
    case $input in
        [yY]*)
            echo 'Continuing'
            break
            ;;
        [nN]*)
            echo 'Ok, exiting'
            exit 1
            ;;
         *)
            echo 'Invalid input' >&2
    esac
done

Como uma função de utilidade:

ask_continue () {
    while true; do
        read -p 'Continue? yes/no: ' input        
        case $input in
            [yY]*)
                echo 'Continuing'
                break
                ;;
            [nN]*)
                echo 'Ok, exiting'
                exit 1
                ;;
             *)
                echo 'Invalid input' >&2
        esac
    done
}

Uma variação da função de utilidade que permite sair através de EOF (por exemplo, pressionando Ctrl + D ):

ask_continue () {
    while read -p 'Continue? yes/no: ' input; do    
        case $input in
            [yY]*)
                echo 'Continuing'
                return
                ;;
            [nN]*)
                break
                ;;
             *)
                echo 'Invalid input' >&2
        esac
    done

    echo 'Ok, exiting'
    exit 1
}

Aqui, existem três maneiras de sair do loop:

  1. O usuário insere "sim" e, nesse caso, a função retorna.
  2. O usuário insere "não" e, nesse caso, nós break saímos do loop e executamos exit 1 .
  3. O read falha devido a algo como encontrar um fim de entrada ou algum outro erro, nesse caso o exit 1 é executado.
por 03.09.2018 / 18:41
6

Por que não apenas repetir a leitura?

unset i
while [[ ! "$i" =~ ^[yYnN]$ ]]; do read -r -p "Would you like to continue  [Y/N] : " i; done
    
por 03.09.2018 / 18:46
2

Você pode fazer isso mantendo o caso da chave dentro de uma função.

function testCase ()
{
    read -r -p "Would you like to continue  [Y/N] : " i
    case $i in
        [yY])
            echo -e "Resuming the script";;
        [nN])
            echo -e "Skipped and exit script"
            exit 1;;
        *)
            echo "Invalid Option"
            testCase
            ;;
    esac
}
testCase

Se a entrada for inválida, ela recuperará a função até obter uma entrada válida.

    
por 03.09.2018 / 18:33
1
until [ "$i" = "0" ]
do
read -r -p "Would you like to continue  [Y/N] : " i
case $i in
        [yY])
                echo -e "Resuming the script";;
        [nN])
                echo -e "Skipped and exit script"
                exit 1;;
        *)
                echo "Invalid Option"
                ;;
esac
done
    
por 03.09.2018 / 20:21