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

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

Are you sure? [Y/n]

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

原因是hg pushhg out听起来可能类似,有时当我想要hgoutrepo ,我可能会偶然地键入hgpushrepo (都是别名)。

更新:如果它可以像使用另一个命令的内置命令一样,例如: confirm && hg push ssh://...那会很棒......只是一个可以要求yesno如果yes ,继续其余的。


这些是更加紧凑和多种形式的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://..

这里大概是你想要的片段。 让我找出如何转发这些论据。

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 yes | command name here :)


为了避免明确地检查这些“是”的变体,可以使用正则表达式使用bash正则表达式运算符'=〜':

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

测试用户输入是以'y'还是'Y'开始,后面是零个或多个'es'。

链接地址: http://www.djcxy.com/p/25539.html

上一篇: In Bash, how to add "Are you sure [Y/n]" to any command or alias?

下一篇: How to use output of SqlPlus query to prompt user for more input