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

Are you sure? [Y/n]

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

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

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


当前回答

好吧,这是我的确认版本,修改自James的版本:

function confirm() {
  local response msg="${1:-Are you sure} (y/[n])? "; shift
  read -r $* -p "$msg" response || echo
  case "$response" in
  [yY][eE][sS]|[yY]) return 0 ;;
  *) return 1 ;;
  esac
}

这些变化是:

使用local防止变量名发生冲突 阅读使用$2 $3…为了控制它的动作,可以使用-n和-t 如果读取退出不成功,回显换行美容 我的Git在Windows上只有bash-3.1,没有true或false,所以使用return代替。当然,这也兼容bash-4.4 (Git for Windows的当前版本)。 使用ipython风格的"(y/[n])"明确表示"n"是默认值。

其他回答

这并不完全是一个“询问是或否”,而只是一个hack: alias hg push…不是hgpushrepo,而是hgpushrepoconfirmedpush,当我能把整个事情说清楚的时候,左脑已经做出了一个合乎逻辑的选择。

Try,

 #!/bin/bash
 pause ()
 {
 REPLY=Y
 while [ "$REPLY" == "Y" ] || [ "$REPLY" != "y" ]
 do
  echo -e "\t\tPress 'y' to continue\t\t\tPress 'n' to quit"
  read -n1 -s
      case "$REPLY" in
      "n")  exit                      ;;
      "N")  echo "case sensitive!!"   ;; 
      "y")  clear                     ;;
      "Y")  echo "case sensitive!!"   ;;
      * )  echo "$REPLY is Invalid Option"     ;;
 esac
 done
 }
 pause
 echo "Hi"

好吧,这是我的确认版本,修改自James的版本:

function confirm() {
  local response msg="${1:-Are you sure} (y/[n])? "; shift
  read -r $* -p "$msg" response || echo
  case "$response" in
  [yY][eE][sS]|[yY]) return 0 ;;
  *) return 1 ;;
  esac
}

这些变化是:

使用local防止变量名发生冲突 阅读使用$2 $3…为了控制它的动作,可以使用-n和-t 如果读取退出不成功,回显换行美容 我的Git在Windows上只有bash-3.1,没有true或false,所以使用return代替。当然,这也兼容bash-4.4 (Git for Windows的当前版本)。 使用ipython风格的"(y/[n])"明确表示"n"是默认值。

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

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

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

#!/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读取的第一个字符。