如果输入无效,如何重新运行 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
}

这里,有3种跳出循环的方法:

  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

您可以通过将 switch case 保留在函数内来实现。

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

相关内容