「yes」を押してbashで「yes / no」操作を実行するには?

「yes」を押してbashで「yes / no」操作を実行するには?

Bashスクリプトに「はい/いいえ」構造があるとしましょう。

read -r -p "Yes or no?" response
if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
 then 
 do ...
else
 exit 0
fi

私は「いいえ」を押すまでこの設定を実行したいと思います。つまり、「はい」を押してから「Do...」を完了したら、「はいまたはいいえ?」で返信したいと思います。

答え1

あなたが望むものではないまで、応答を依頼する必要があります。

while true;
do
    read -r -p "Yes or no? " response   
    if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
    then
        echo "You chose yes"
    else
        exit 0
    fi
done

答え2

whileループを使用してください:

while
  read -r -p "Yes or no? " response &&
    [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
do
  ...
done

shまたは、インストールする必要がないように、コードをPOSIXと互換性があるようにしてくださいbash

while
   printf 'Yes or No? ' &&
     read answer
do
  case $answer in
    ([yY][eE][sS] | [yY]) ...;;
    (*) break;;
  esac
done

printfループの終了条件として、失敗した終了状態(壊れたパイプを示す可能性があります)と(eofを示す可能性があります)も確認します。readこれは一般的に欲しいものだからです。

bashsの場合、プロセスに組み込まれたシェルによってプロンプトが表示されるため、 stdoutが破損しread -pたパイプにreadなるとシェルは終了しますが、シェルが終了するかprintfどうかは実装printfによって異なります。sh実装には組み込み機能がありますprintf。一貫性のために、printfエラーを独自のスクリプトエラーとして報告することもできます。

while
   printf 'Yes or No? ' || exit # with the exit status of printf
   read answer # eof not considered as an error condition
do
  case $answer in
    ([yY][eE][sS] | [yY]) ...;;
    (*) break;;
  esac
done

関連情報