如何提示用户在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
优点:
- 整洁
- 可以使用“OR”条件更容易
- 可以使用字符范围,例如[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