我想快点说“你确定吗?”提示在潜在危险的bash脚本顶部进行确认,最简单/最好的方法是什么?
答案 0 :(得分:823)
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
以接受一个字符而无需按 Enter 大骨节病>。您可以使用其中一个或两个。
此外,否定形式可能如下所示:
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中运行而导致的语法错误,否定的形式可能允许脚本继续“危险的东西”。失败模式应该有利于最安全的结果,因此只应使用第一个未被否定的if
。
说明:
read
命令输出提示符(-p "prompt"
)然后接受一个字符(-n 1
)并按字面接受反斜杠(-r
)(否则read
会将反斜杠视为转义并等待第二个字符)。如果您没有提供如下名称,则read
存储结果的默认变量为$REPLY
:read -p "my prompt" -n 1 -r my_var
if
语句使用正则表达式检查$REPLY
中的字符是否匹配(=~
)大写或小写“Y”。这里使用的正则表达式表示“一个字符串开头(^
),仅包含括号表达式([Yy]
)和结束($
)”中的一个字符列表。锚点(^
和$
)可防止匹配较长的字符串。在这种情况下,它们有助于强化read
命令中设置的单字符限制。
否定形式使用逻辑“非”运算符(!
)来匹配(=~
)任何不是“Y”或“y”的字符。表达这种情况的另一种方式是可读性较差,并且在这种情况下不能清楚地表达我的意图。但是,这就是它的样子:if [[ $REPLY =~ ^[^Yy]$ ]]
答案 1 :(得分:149)
用例/ esac。
read -p "Continue (y/n)?" choice
case "$choice" in
y|Y ) echo "yes";;
n|N ) echo "no";;
* ) echo "invalid";;
esac
优势:
答案 2 :(得分:30)
尝试read
shell内置:
read -p "Continue (y/n)?" CONT
if [ "$CONT" = "y" ]; then
echo "yaaa";
else
echo "booo";
fi
答案 3 :(得分:30)
这样你就可以得到'是'或'回车'
read -r -p "Are you sure? [Y/n]" response
response=${response,,} # tolower
if [[ $response =~ ^(yes|y| ) ]] || [[ -z $response ]]; then
your-action-here
fi
如果你使用zsh试试这个:
read "response?Are you sure ? [Y/n] "
response=${response:l} #tolower
if [[ $response =~ ^(yes|y| ) ]] || [[ -z $response ]]; then
your-action-here
fi
答案 4 :(得分:20)
这是我使用的功能:
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...
我希望你喜欢它,
干杯!
答案 5 :(得分:15)
我在其他地方发现的是,有更好的版本吗?
read -p "Are you sure you wish to continue?"
if [ "$REPLY" != "yes" ]; then
exit
fi
答案 6 :(得分:6)
[[ -f ./${sname} ]] && read -p "File exists. Are you sure? " -n 1
[[ ! $REPLY =~ ^[Yy]$ ]] && exit 1
在函数中使用它来查找现有文件并在覆盖之前提示。
答案 7 :(得分:4)
#!/bin/bash
echo Please, enter your name
read NAME
echo "Hi $NAME!"
if [ "x$NAME" = "xyes" ] ; then
# do something
fi
我是一个简短的脚本,用于读取bash并回显结果。
答案 8 :(得分:2)
和:使用
read VARNAME
echo $VARNAME
对于没有readline支持的单行响应。然后根据需要测试$ VARNAME。
答案 9 :(得分:2)
echo are you sure?
read x
if [ "$x" = "yes" ]
then
# do the dangerous stuff
fi