有些人可能在 Ubuntu 中通过终端安装或更新时发现了这一点
你得到一个类似的问题
“您是否安装或删除软件包 [Y/n]?”
当你按下回车时,它就像你输入“Y”或“y”时一样
所以我想知道如何在 bash 中做到这一点这是我到目前为止所拥有的?
echo "question?[Y/n]"
read choose
if [ $choose ~= "Y" ] [ $choose ~= "y" ] [ $choose ~= "" ]
then
#code
fi
有些人可能在 Ubuntu 中通过终端安装或更新时发现了这一点
你得到一个类似的问题
“您是否安装或删除软件包 [Y/n]?”
当你按下回车时,它就像你输入“Y”或“y”时一样
所以我想知道如何在 bash 中做到这一点这是我到目前为止所拥有的?
echo "question?[Y/n]"
read choose
if [ $choose ~= "Y" ] [ $choose ~= "y" ] [ $choose ~= "" ]
then
#code
fi
经典地(意味着它可以在 POSIX-ish shell 中工作bash
),你会写:
echo "Question? [Y/n]"
read choose
if [ "$choose" = "Y" ] || [ "$choose" = "y" ] || [ -z "$choose" ]
then
# code
fi
引号确保测试操作员看到一个参数,即使$choose
是一个空字符串。
该[[
运算符似乎允许您在不引用字符串的情况下逃脱,但它不是 POSIX shell 的一部分。POSIX 通过以下方式认识到它的存在:
以下单词在某些实现中可能被识别为保留字(当没有引用任何字符时),导致未指定的结果:
[[ ]] function select
如果您希望 shell 将光标留在提示符所在的同一行,您可以使用:
printf "Question? [Y/n] "
POSIX shell 识别\c
转义;bash
才不是:
echo "Question? [Y/n] \c"
(可能有一种方法可以bash
处理它,但printf
可能更便携。)
echo -n "Question? [Y/n]"
read choose
shopt -s nocasematch
if [[ "${choose:=Y}" =~ Y ]]; then
# they said yes
else
# they said something else
fi
这种方法有一个可能的优势,即$choose
如果您稍后检查它,它会保留设置为 Y。如果您希望以后能够知道他们是输入了Y
还是刚刚按下了输入,您可以${choose:-Y}
改用。
如果您不想设置nocasematch
,您可以随时明确检查Y
和y
。或者,如果您喜欢该nocasematch
解决方案但关心保留标志的状态,您可以检查并恢复它:
shopt -q nocasematch
let not_set=$?
shopt -s nocasematch
...
if (( not_set )); then
shopt -u nocasematch
fi
见test(1)
。
[ "$choose" = "Y" -o "$choose" = "y" -o "$choose" = "" ]
你必须把变量放在双引号之间,否则表达式会产生一个空变量的错误,因为它们各自的左边都是空的。
"read" 读取输入以进入。因此,如果您只想接受“输入”作为答案,请尝试使用“”答案。您可以使用 [[ ]] 而不是“test”命令来检查字符串( man test )
dtpwmbp:~ pwadas$ [[ -z "" ]] && echo yes
yes
dtpwmbp:~ pwadas$ [[ -z "ABCD" ]] && echo yes
dtpwmbp:~ pwadas$
在这里,测试字符串的零长度。