小编典典

在 Bash 中,如何将“Are you sure [Y/n]”添加到任何命令或别名?

all

在这种特殊情况下,我想在 Bash 中添加一个确认

你确定吗?[是/否]

对于 Mercurial 的hg push ssh://username@www.example.com//somepath/morepath,这实际上是一个别名。有没有标准的命令可以添加到别名中来实现呢?

原因是hg pushandhg out听起来很相似,有时当我想要时hgoutrepo,我可能会不小心输入hgpushrepo(两者都是别名)。

更新: 如果它可以是带有另一个命令的内置命令,例如:confirm && hg push ssh://...那就太好了......只是一个可以要求 a yesorno并继续其余 if的命令yes


阅读 58

收藏
2022-05-13

共1个答案

小编典典

这些是[Hamish 答案的更紧凑和通用的形式。它们处理大小写字母的任何混合:

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根据我的回答中的第一个版本创建和使用命令(它与其他两个版本类似):

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://..
2022-05-13