1. ホーム
  2. バッシュ

[解決済み】Bashで、任意のコマンドやエイリアスに「Are you sure [Y/n]」を追加するには?

2022-04-05 04:13:53

質問

このような場合、Bashでconfirmを追加して

本当にいいんですか?[Y/n]

は、Mercurial の hg push ssh://[email protected]//somepath/morepath というのは、実はエイリアスなのです。 それを実現するためにエイリアスに追加できる標準的なコマンドはあるのでしょうか?

その理由は hg pushhg out は似たような音に聞こえることがあり、時々 hgoutrepo と入力することがあります。 hgpushrepo (どちらもエイリアスです)。

更新しました。 のように、他のコマンドを使った組み込みコマンドのようなものにできれば。 confirm && hg push ssh://... と聞けるようなコマンドがあればいいんですけどね。 yes または no であれば、残りを続けます。 yes .

解決方法は?

の、よりコンパクトで汎用性の高い形式です。 ハーミッシュの 回答 . 大文字と小文字の混在した文字も扱える。

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://..