입력이 유효하지 않은 경우 Case 문을 어떻게 다시 실행합니까? [복사]

입력이 유효하지 않은 경우 Case 문을 어떻게 다시 실행합니까? [복사]

스크립트를 재개할지 확인하기 위해 스크립트 중간에 다음 코드가 있습니다.

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

입력 옵션이 유효하지 않은지 알 수 있는 방법이 있는지 궁금합니다. switch-case를 호출할 수 있는 방법이 있나요?

답변1

루프 입력. 사용자로부터 유효한 응답을 받으면 루프를 종료합니다 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. 사용자가 "yes"를 입력하면 함수가 반환됩니다.
  2. 사용자가 "no"를 입력하면 break루프를 종료하고 을 실행합니다 exit 1.
  3. read이 경우 입력 종료 또는 기타 오류로 인해 실패한 경우 실행됩니다 exit 1.

대신 사용자가 계속하기를 원하지 않을 때 수행할 작업을 호출자가 결정하도록 허용을 exit 1사용할 수 있습니다 . return 1호출 코드는 다음과 같습니다.

if ! ask_continue; then
    # some cleanup, then exit
fi

답변2

그냥 다시 읽어보면 어떨까요?

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

답변3

함수 내부에 스위치 케이스를 유지하면 됩니다.

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

입력이 유효하지 않은 경우 유효한 입력을 얻을 때까지 함수를 호출합니다.

답변4

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

관련 정보