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

Are you sure? [Y/n]

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

原因是hgpush和hgout听起来很相似,有时当我想要hgoutrepo时,我可能会意外地键入hgpushrepo(两者都是别名)。

更新:如果可以像内置命令一样使用另一个命令,比如:confirm && hg push ssh://…那太好了……只是一个命令,可以询问“是”或“否”,如果是则继续其余的操作。


当前回答

这个版本允许你有不止一种情况y或y n或n

Optionally: Repeat the question until an approve question is provided Optionally: Ignore any other answer Optionally: Exit the terminal if you want confirm() { echo -n "Continue? y or n? " read REPLY case $REPLY in [Yy]) echo 'yup y' ;; # you can change what you do here for instance [Nn]) break ;; # exit case statement gracefully # Here are a few optional options to choose between # Any other answer: # 1. Repeat the question *) confirm ;; # 2. ignore # *) ;; # 3. Exit terminal # *) exit ;; esac # REPLY='' }

还要注意:在这个函数的最后一行清除REPLY变量。否则,如果你回显$REPLY,你会看到它仍然设置,直到你打开或关闭你的终端或再次设置它。

其他回答

不一样,但不管怎样都行得通。

#!/bin/bash  
i='y'  
while [ ${i:0:1} != n ]  
do  
    # Command(s)  
    read -p " Again? Y/n " i  
    [[ ${#i} -eq 0 ]] && i='y'  
done  

输出: 一遍吗?Y / n n 一遍吗?Y / n任何 一遍吗?Y / n 7 一遍吗?Y / n & 一遍吗?Y / n nsijf $

现在只检查$i读取的第一个字符。

下面的代码结合了两个东西

shop -s nocasmatch将照顾大小写不敏感 if条件会接受两个输入要么你传递yes yes y。 shop -s nocasematch 如果[[sed-4.2.2.]$LINE =~ (yes|y)$]] 然后退出0 fi

为了避免显式检查'yes'的这些变体,你可以使用bash正则表达式操作符'=~'和一个正则表达式:

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

它测试用户输入是否以“y”或“y”开头,后面是0个或多个“es”。

在游戏后期,我创建了前面答案的确认函数的另一个变体:

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一起工作,但在shell中可能会失败 如果参数干扰echo或xargs,则可能失败 因为编写shell脚本很难,所以有无数的其他bug

这是我的解决方案,使用本地化正则表达式。所以在德语中,“Ja”的“j”也会被解释为“是”。

第一个参数是问题,如果第二个参数是y,那么yes将是默认答案,否则no将是默认答案。如果答案是“是”,则返回值为0,如果答案是“否”,则返回值为1。

function shure(){
    if [ $# -gt 1 ] && [[ "$2" =~ ^[yY]*$ ]] ; then
        arg="[Y/n]"
        reg=$(locale noexpr)
        default=(0 1)
    else
        arg="[y/N]"
        reg=$(locale yesexpr)
        default=(1 0)
    fi
    read -p "$1 ${arg}? : " answer
    [[ "$answer" =~ $reg ]] && return ${default[1]} || return ${default[0]}
}

下面是一个基本用法

# basic example default is no
shure "question message" && echo "answer yes" || echo "answer no"
# print "question message [y/N]? : "

# basic example default set to yes
shure "question message" y && echo "answer yes" || echo "answer no"
# print "question message [Y/n]? : "