小编典典

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

all

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


阅读 176

收藏
2022-03-02

共1个答案

小编典典

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]$ ]]

2022-03-02