入力が無効な場合、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

機能内部にスイッチケースを保持するだけです。

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

関連情報