Как повторно запустить оператор case, если введенные данные неверны? [дубликат]

Код

sed -i 's/^M//' filename.txt

При вводе ^ M в команде не используйте shift + 6 & M . Вы должны использовать ctrl + v + м .

6
03.09.2018, 20:18
4 ответа

Вы можете сделать это, сохранив регистр switch внутри функции.

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

Если ввод недействителен, функция будет вызывать функцию до тех пор, пока не будет получен допустимый ввод.

2
27.01.2020, 20:20

Вводите данные в цикле. Выйдите из цикла с помощьюbreak(или exit, в зависимости от случая ), если вы получите действительный ответ от пользователя.

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

В качестве функции полезности:

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
}

Разновидность служебной функции, которая позволяет выйти через EOF (, например. нажав 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
}

Здесь есть три выхода из цикла:

  1. Пользователь вводит «да», и в этом случае функция возвращается.
  2. Пользователь вводит «нет», и в этом случае мы breakвыходим из цикла и выполняем exit 1.
  3. Ошибка readвозникает из-за чего-то вроде обнаружения конца -ввода -или какой-либо другой ошибки, и в этом случае exit 1выполняется.

Вместо exit 1вы можете использовать return 1, чтобы разрешить вызывающему абоненту решать, что делать, когда пользователь не хочет продолжать. Вызывающий код может выглядеть как

if ! ask_continue; then
    # some cleanup, then exit
fi
14
27.01.2020, 20:20

Почему бы просто не повторить прочитанное?

unset i
while [[ ! "$i" =~ ^[yYnN]$ ]]; do read -r -p "Would you like to continue  [Y/N] : " i; done
7
27.01.2020, 20:20
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
1
27.01.2020, 20:20

Теги

Похожие вопросы