如何提示用户在bash脚本中进行确认?

我想快点“你确定吗?” 提示在有潜在危险的bash脚本的顶部进行确认,最简单/最好的方法是什么?

read -p "Are you sure? " -n 1 -r echo # (optional) move to a new line if [[ $REPLY =~ ^[Yy]$ ]] then # do dangerous stuff fi 

编辑

我join了levislevis85的build议(谢谢!),并添加了-n选项来read接受一个字符,而不需要按Enter键 。 您可以使用其中的一个或两个。

而且,否定forms可能如下所示:

 read -p "Are you sure? " -n 1 -r echo # (optional) move to a new line if [[ ! $REPLY =~ ^[Yy]$ ]] then [[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1 # handle exits from shell or function but don't exit interactive shell fi 

但是,正如Erich所指出的那样,在某些情况下,例如脚本在错误的shell中运行导致的语法错误,否定forms可能会使脚本继续“危险的东西”。 失败模式应该有利于最安全的结果,所以只有第一个,没有否定, if应该使用。

用例/ esac。

 read -p "Continue (y/n)?" choice case "$choice" in y|Y ) echo "yes";; n|N ) echo "no";; * ) echo "invalid";; esac 

优点:

  1. 整洁
  2. 可以使用“OR”条件更容易
  3. 可以使用字符范围,例如[yY] [eE] [sS]接受单词“是”,其中的任何字符可以是小写或大写。

这样你就可以得到“是”或“回车”

  read -r -p "Are you sure? [Y/n]" response response=${response,,} # tolower if [[ $response =~ ^(yes|y| ) ]] || [[ -z $response ]]; then your-action-here fi 

尝试read shell内置:

 read -p "Continue (y/n)?" CONT if [ "$CONT" = "y" ]; then echo "yaaa"; else echo "booo"; fi 

这是我使用的function:

 function ask_yes_or_no() { read -p "$1 ([y]es or [N]o): " case $(echo $REPLY | tr '[AZ]' '[az]') in y|yes) echo "yes" ;; *) echo "no" ;; esac } 

并使用它的一个例子:

 if [[ "no" == $(ask_yes_or_no "Are you sure?") || \ "no" == $(ask_yes_or_no "Are you *really* sure?") ]] then echo "Skipped." exit 0 fi # Do something really dangerous... 
  • 输出总是“是”或“否”
  • 这是默认的“否”
  • 除“y”或“yes”之外的所有内容都返回“no”,所以对于危险的bash脚本来说是非常安全的
  • 而且不区分大小写,“Y”,“Yes”或“YES”的作用是“是”。

我希望你喜欢它,
干杯!

这是我在别处find的,有没有更好的版本?

 read -p "Are you sure you wish to continue?" if [ "$REPLY" != "yes" ]; then exit fi 
 [[ -f ./${sname} ]] && read -p "File exists. Are you sure? " -n 1 [[ ! $REPLY =~ ^[Yy]$ ]] && return 1 

在函数中使用它来查找现有的文件,并在覆盖之前提示。

 #!/bin/bash echo Please, enter your name read NAME echo "Hi $NAME!" if [ "x$NAME" = "xyes" ] ; then # do something fi 

我用简短的脚本来阅读bash并回显结果。

qnd:使用

 read VARNAME echo $VARNAME 

对于没有readline支持的一行响应。 然后testing$ VARNAME,但是你想要的。

 echo are you sure? read x if [ "$x" = "yes" ] then # do the dangerous stuff fi