bash スクリプトでユーザーに確認を求めるにはどうすればよいですか? [重複] 質問する

bash スクリプトでユーザーに確認を求めるにはどうすればよいですか? [重複] 質問する

潜在的に危険な bash スクリプトの先頭に、確認のための「よろしいですか?」プロンプトをすばやく表示したいのですが、これを行う最も簡単/最良の方法は何ですか?

ベストアンサー1

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

levislevis85さんの提案を取り入れて(ありがとうございます!)、を押さなくても 1 文字を受け入れる-nオプションを追加しました。これらのいずれかまたは両方を使用できます。readEnter

また、否定形は次のようになります。

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") を出力し、1 つの文字 ( -n 1) を受け入れ、バックスラッシュを文字通り受け入れます ( -r) (そうでない場合、バックスラッシュをエスケープ文字と見なし、2 番目の文字を待機します)。名前を指定しない場合、結果を格納する のreadデフォルト変数は、次のようになります。read$REPLYread -p "my prompt" -n 1 -r my_var

このifステートメントでは、正規表現を使用して、 の文字が大文字または小文字の「Y」に一致するかどうかを確認します$REPLY( )。ここで使用されている正規表現は、「( ) で始まり、括弧式 ( ) 内の文字リストの 1 つだけで構成され、( ) で終わる文字列」を意味します。アンカー (および) は、長い文字列の一致を防止します。この場合、アンカーはコマンドで設定された 1 文字の制限を強化するのに役立ちます。=~^[Yy]$^$read

否定形式では、論理「not」演算子 ( !)を使用して=~、「Y」または「y」以外の任意の文字に一致します ( )。これを表現する別の方法は、読みにくく、この場合の意図を明確に表現していないと私は考えています。ただし、次のようになります。if [[ $REPLY =~ ^[^Yy]$ ]]

おすすめ記事