2009-12-11 33 views
386

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

+0

[相关](http://stackoverflow.com/questions/3231804/in-bash-how-to-add-are-you-sure-yn-to-any-command-or-alias) – 2013-08-04 21:20:14

回答

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

编辑

我纳入levislevis85的建议(感谢!),并且增加了-n选项read接受一个字符,而不需要按输入。您可以使用其中的一个或两个。

而且,否定形式可能是这样的:

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指出,在某些情况下,如造成错误的壳中运行该脚本语法错误,否定形式可以让脚本继续“危险的东西”。失败模式应该支持最安全的结果,因此只应使用第一个非否定if

+0

谢谢,双方括号做什么? – Tom 2009-12-11 03:02:18

+0

并且可以否定?即如果不匹配,则退出? – Tom 2009-12-11 03:04:46

+2

它比'[]'包括正则表达式匹配运算符'=〜'更多的特征。参见:http://mywiki.wooledge.org/BashFAQ/031 – 2009-12-11 03:09:44

2

QND:使用

read VARNAME 
echo $VARNAME 

为无的readline支持一个行响应。然后测试$ VARNAME,但是你想要的。

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

尝试read外壳内置:

read -p "Continue (y/n)?" CONT 
if [ "$CONT" = "y" ]; then 
    echo "yaaa"; 
else 
    echo "booo"; 
fi 
3
#!/bin/bash 
echo Please, enter your name 
read NAME 
echo "Hi $NAME!" 
if [ "x$NAME" = "xyes" ] ; then 
# do something 
fi 

我是个简短的脚本来读取bash和回显的结果。

11

这是我在别处找到的,是否有更好的版本?

read -p "Are you sure you wish to continue?" 
if [ "$REPLY" != "yes" ]; then 
    exit 
fi 
106

用例/ 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]接受词 “是” ,其中任何字符可以是小写或大写。
+5

好的解决方案。就个人而言,如果bash脚本真的可能会瘫痪,我喜欢让人输入'yes'。 – SiegeX 2009-12-11 05:33:59

+0

如何在输入为no时退出(也许'echo“退出脚本。”; exit ;;'),但如果输入为yes,那么脚本将继续执行'esac'之后的任何内容? – 2014-02-13 23:53:29

+0

如果你做'n | N)echo“no”; return ;;'如果你说'n',剧本将在那里结束,否则继续其余的部分,那你的意思是? – Rellikiox 2014-02-14 13:02:20

4
[[ -f ./${sname} ]] && read -p "File exists. Are you sure? " -n 1 

[[ ! $REPLY =~ ^[Yy]$ ]] && return 1 

使用这一个功能,查找现有的文件,并覆盖前提示。

+0

解析器抱怨'返回'外的函数,你可能是'退出'。我仍然喜欢你的答案,因为如果确认它不缩进要执行的代码。 – dhill 2017-02-17 20:30:42

23

这样,你得到 'Y' '是' 或 '回车'

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

不接受默认Y – 2015-02-20 14:43:10

+1

对于默认Y 如果[[$ response =〜^(yes | y |)]]] | [-z $ response];然后 – 2015-02-20 14:48:38

16

这是我使用的功能:用它

function ask_yes_or_no() { 
    read -p "$1 ([y]es or [N]o): " 
    case $(echo $REPLY | tr '[A-Z]' '[a-z]') 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”或“是”返回“无”,所以这是一个危险的bash脚本
  • 很安全,这是不区分大小写,“Y”,“是”,或“是”工作为“是”。

我希望你喜欢它,
干杯!

相关问题