在这种特殊情况下,我想在 Bash 中添加一个确认
你确定吗?[是/否]
对于 Mercurial 的hg push ssh://username@www.example.com//somepath/morepath,这实际上是一个别名。有没有标准的命令可以添加到别名中来实现呢?
hg push ssh://username@www.example.com//somepath/morepath
原因是hg pushandhg out听起来很相似,有时当我想要时hgoutrepo,我可能会不小心输入hgpushrepo(两者都是别名)。
hg push
hg out
hgoutrepo
hgpushrepo
更新: 如果它可以是带有另一个命令的内置命令,例如:confirm && hg push ssh://...那就太好了......只是一个可以要求 a yesorno并继续其余 if的命令yes。
confirm && hg push ssh://...
yes
no
这些是[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". —— 始终在包含字符串的变量中使用双引号(例如:更喜欢使用"$@"而不是$@)。
$response
"$response"
"$@"
$@
或者,Bash 4.x:
read -r -p "Are you sure? [y/N] " response response=${response,,} # tolower if [[ "$response" =~ ^(yes|y)$ ]] ...
编辑:
作为对您的编辑的回应,以下是您如何confirm根据我的回答中的第一个版本创建和使用命令(它与其他两个版本类似):
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://..