我想在一个有潜在危险的bash脚本的顶部快速提示“你确定吗?”以进行确认,最简单/最好的方法是什么?
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选项来阅读以接受一个字符,而无需按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命令中设置的一个字符限制。
否定形式使用逻辑“not”运算符(!)来匹配(=~)任何不是“Y”或“Y”的字符。表达这一点的另一种方式可读性较差,并且在本例中没有明确表达我的意图。然而,这是它的样子:如果[[$REPLY=~^[^Yy]$]]
尝试read shell内置:
read -p "Continue (y/n)?" CONT
if [ "$CONT" = "y" ]; then
echo "yaaa";
else
echo "booo";
fi
#!/bin/bash
echo Please, enter your name
read NAME
echo "Hi $NAME!"
if [ "x$NAME" = "xyes" ] ; then
# do something
fi
我是一个在bash中读取并回显结果的简短脚本。
这是我在其他地方找到的,有更好的版本吗?
read -p "Are you sure you wish to continue?"
if [ "$REPLY" != "yes" ]; then
exit
fi
用例/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]来接受单词“yes”,其中任何字符都可以是小写或大写。
[[ -f ./${sname} ]] && read -p "File exists. Are you sure? " -n 1
[[ ! $REPLY =~ ^[Yy]$ ]] && exit 1
在函数中使用此选项查找现有文件并在覆盖之前提示。
这样您就可以得到“y”、“yes”或“Enter”
read -r -p "Are you sure? [Y/n]" response
response=${response,,} # tolower
if [[ $response =~ ^(y| ) ]] || [[ -z $response ]]; then
your-action-here
fi
如果您正在使用zsh,请尝试以下操作:
read "response?Are you sure ? [Y/n] "
response=${response:l} #tolower
if [[ $response =~ ^(y| ) ]] || [[ -z $response ]]; then
your-action-here
fi
下面是我使用的函数:
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”或“yes”之外的所有内容都返回“no”,因此对于危险的bash脚本来说是非常安全的它不区分大小写,“Y”、“是”或“是”与“是”相同。
我希望你喜欢,干杯