264

この特定のケースでは、Bash で確認を追加したいと思います。

本気ですか?[はい/いいえ]

Mercurial のhg push ssh://username@www.example.com//somepath/morepath、実際にはエイリアスです。それを達成するためにエイリアスに追加できる標準コマンドはありますか?

その理由は、hg pushhg outが似ているように聞こえることがあり、必要なときにhgoutrepo誤って を入力することhgpushrepoがあります (どちらもエイリアスです)。

更新:それが次のような別のコマンドを備えた組み込みコマンドのようなものである場合:confirm && hg push ssh://...それは素晴らしいことです... yesorを要求noして残りの if を続行できるコマンドですyes

4

19 に答える 19

394

これらはHamish's answerのよりコンパクトで用途の広い形式です。大文字と小文字の混合を処理します。

read -r -p "Are you sure? [y/N] " response
case "$response" in
    [yY][eE][sS]|[yY]) 
        do_something
        ;;
    *)
        do_something_else
        ;;
esac

または、Bash >= バージョン 3.2 の場合:

read -r -p "Are you sure? [y/N] " response
if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]]
then
    do_something
else
    do_something_else
fi

注:$responseが空の文字列の場合、エラーが発生します。修正するには、引用符を追加するだけです: "$response". – 文字列を含む変数では常に二重引用符を使用します (例:"$@"代わりに使用することをお勧めします$@)。

または、Bash 4.x:

read -r -p "Are you sure? [y/N] " response
response=${response,,}    # tolower
if [[ "$response" =~ ^(yes|y)$ ]]
...

編集:

あなたの編集に応じてconfirm、私の回答の最初のバージョンに基づいてコマンドを作成して使用する方法を次に示します (他の 2 つと同様に機能します)。

confirm() {
    # call with a prompt string or use a default
    read -r -p "${1:-Are you sure? [y/N]} " response
    case "$response" in
        [yY][eE][sS]|[yY]) 
            true
            ;;
        *)
            false
            ;;
    esac
}

この機能を使用するには:

confirm && hg push ssh://..

また

confirm "Would you really like to do a push?" && hg push ssh://..
于 2010-07-12T20:36:50.580 に答える
24

これは大まかに必要なスニペットです。引数を転送する方法を見てみましょう。

read -p "Are you sure you want to continue? <y/N> " prompt
if [[ $prompt == "y" || $prompt == "Y" || $prompt == "yes" || $prompt == "Yes" ]]
then
  # http://stackoverflow.com/questions/1537673/how-do-i-forward-parameters-to-other-command-in-bash-script
else
  exit 0
fi

注意してyes | command name hereください:)

于 2010-07-12T20:04:12.617 に答える
14

これらの「yes」のバリアントを明示的にチェックしないようにするには、正規表現で bash 正規表現演算子「=~」を使用できます。

read -p "Are you sure you want to continue? <y/N> " prompt
if [[ $prompt =~ [yY](es)* ]]
then
(etc...)

これは、ユーザー入力が「y」または「Y」で始まり、その後に 0 個以上の「es」が続くかどうかをテストします。

于 2010-07-12T20:33:23.387 に答える
8

これはハックかもしれません:

問題のように、Unix / Bashでは、「xargs -p」はコマンドを実行する前に確認を促す良い方法ですか?

xargs仕事をするために使用できます:

echo ssh://username@www.example.com//somepath/morepath | xargs -p hg push

もちろん、これは次のようにエイリアスとして設定されます hgpushrepo

例:

$ echo foo | xargs -p ls -l
ls -l foo?...y
-rw-r--r--  1 mikelee    staff  0 Nov 23 10:38 foo

$ echo foo | xargs -p ls -l
ls -l foo?...n

$
于 2010-08-03T21:15:57.720 に答える
4

以下を /etc/bashrc ファイルに追加します。このスクリプトは、"confirm" というエイリアスの代わりに常駐の "function" を追加します。


function confirm( )
{
#alert the user what they are about to do.
echo "About to $@....";
#confirm with the user
read -r -p "Are you sure? [Y/n]" response
case "$response" in
    [yY][eE][sS]|[yY]) 
              #if yes, then execute the passed parameters
               "$@"
               ;;
    *)
              #Otherwise exit...
              echo "ciao..."
              exit
              ;;
esac
}
于 2010-07-12T22:16:02.717 に答える
4
read -r -p "Are you sure? [Y/n]" response
  response=${response,,} # tolower
  if [[ $response =~ ^(yes|y| ) ]] || [[ -z $response ]]; then
      your-action-here
  fi
于 2010-07-14T13:17:48.500 に答える
1

confirmゲームには遅れましたが、以前の回答の関数のさらに別のバリアントを作成しました。

confirm ()
{
    read -r -p "$(echo $@) ? [y/N] " YESNO

    if [ "$YESNO" != "y" ]; then
        echo >&2 "Aborting"
        exit 1
    fi

    CMD="$1"
    shift

    while [ -n "$1" ]; do
        echo -en "$1\0"
        shift
    done | xargs -0 "$CMD" || exit $?
}

使用するには:

confirm your_command

特徴:

  • コマンドをプロンプトの一部として出力します
  • NULL区切り文字を使用して引数を渡します
  • コマンドの終了状態を保持します

バグ:

  • echo -en動作しbashますが、シェルで失敗する可能性があります
  • 引数が干渉しechoたり、xargs
  • シェルスクリプトは難しいため、無数の他のバグ
于 2013-02-02T01:52:40.977 に答える
0

これは正確には「イエスかノーかを尋ねる」ものではなく、ただのハックです: 別名hg push ...tohgpushrepoではなく tohgpushrepoconfirmedpushであり、私がすべてを説明できるようになるまでに、左脳は論理的な選択を行っています.

于 2010-07-13T01:10:42.483 に答える
0

以下のコードは2つのことを組み合わせています

  1. 大文字と小文字を区別しない shopt -s nocasematch

  2. 両方の入力を受け入れる条件の場合は、yes、Yes、YES、y を渡します。

    shopt -s nocasematch

    [[ sed-4.2.2.$LINE =~ (yes|y)$ ]] の場合

    その後、0を終了します

    フィ

于 2017-09-30T14:21:43.170 に答える