1. ホーム
  2. bash

[解決済み] bashスクリプトでユーザーに確認のプロンプトを出すには?重複

2022-03-14 20:06:29

質問

潜在的に危険なbashスクリプトの先頭に、確認のためのクイック"are you sure?"プロンプトを表示したいのですが、最も簡単で最善の方法は何でしょうか。

どのように解決するのですか?

read -p "Are you sure? " -n 1 -r
echo    # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]
then
    # do dangerous stuff
fi

組み込んだ levislevis85 の提案 (ありがとうございます!) を受け、さらに -n オプションに read を押さなくても1文字受け取れるように 入力 . これらのどちらか一方、または両方を使用することができます。

また、否定形は次のようになることもあります。

read -p "Are you sure? " -n 1 -r
echo    # (optional) move to a new line
if [[ ! $REPLY =~ ^[Yy]$ ]]
then
    [[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1 # handle exits from shell or function but don't exit interactive shell
fi

しかし、Erichが指摘したように、間違ったシェルで実行されたスクリプトによる構文エラーなどの状況下では、否定されたフォームによってスクリプトが "危険なもの" に進むことができる可能性があります。失敗モードは最も安全な結果を優先すべきなので、最初の、否定されない if を使用する必要があります。

説明

read コマンドはプロンプトを出力します ( -p "prompt" ) の後、一文字を受け入れる ( -n 1 )、バックスラッシュを文字通りに受け取ります( -r ) (そうでない場合は read はバックスラッシュをエスケープとみなし、2文字目を待つことになります)。のデフォルト変数は read で、結果を格納するのは $REPLY というように、名前を指定しない場合は read -p "my prompt" -n 1 -r my_var

if 文は、正規表現を使用して、文字が $REPLY に一致する ( =~ ) 大文字または小文字の "Y" です。ここで使われている正規表現は、quot; a string starting ( ^ ) で、括弧式に含まれる文字のリストのうちの1つだけで構成されている ( [Yy] )で終わり、( $ )"です。アンカー( ^$ ) は、長い文字列にマッチングしないようにします。この場合、これらは read コマンドを使用します。

否定形は、論理演算子 "not" を使用します ( ! ) にマッチします。 =~ ) "Y" または "y" でない任意の文字。これを表現する別の方法は、可読性が低く、この例では私の意見では、意図を明確に表現していません。しかし、このような形になります。 if [[ $REPLY =~ ^[^Yy]$ ]]