web-dev-qa-db-ja.com

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

入力オプションが無効な場合にスイッチケースを呼び出す方法はありますか?

7
user308897

入力はループで行います。ユーザーから有効な応答を受け取った場合は、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. ユーザーが「いいえ」と入力すると、ループから抜け出し、breakを実行してexit 1を実行します。
  3. readは、入力の終了やその他のエラーが発生したなどの理由で失敗します。この場合、exit 1が実行されます。

exit 1の代わりに、return 1を使用して、ユーザーが続行したくない場合に呼び出し側が何をするかを決定できるようにすることができます。呼び出しコードは次のようになります

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

読み取りを繰り返すだけではどうですか。

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

関数内にスイッチケースを保持することで実行できます。

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
msp9011
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
GAD3R