2

有些人可能在 Ubuntu 中通过终端安装或更新时发现了这一点

你得到一个类似的问题

“您是否安装或删除软件包 [Y/n]?”

当你按下回车时,它就像你输入“Y”或“y”时一样

所以我想知道如何在 bash 中做到这一点这是我到目前为止所拥有的?

echo "question?[Y/n]"
read choose
if [ $choose ~= "Y" ] [ $choose ~= "y" ] [ $choose ~= "" ]
then 
#code
fi
4

4 回答 4

6

经典地(意味着它可以在 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可能更便携。)

于 2012-09-17T23:34:14.577 回答
3
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,您可以随时明确检查Yy。或者,如果您喜欢该nocasematch解决方案但关心保留标志的状态,您可以检查并恢复它:

shopt -q nocasematch
let not_set=$?
shopt -s nocasematch

...

if (( not_set )); then
   shopt -u nocasematch
fi
于 2012-09-17T23:41:47.777 回答
2

test(1)

[ "$choose" = "Y" -o "$choose" = "y" -o "$choose" = "" ]

必须把变量放在双引号之间,否则表达式会产生一个空变量的错误,因为它们各自的左边都是空的。

于 2012-09-17T23:29:04.287 回答
1

"read" 读取输入以进入。因此,如果您只想接受“输入”作为答案,请尝试使用“”答案。您可以使用 [[ ]] 而不是“test”命令来检查字符串( man test )

dtpwmbp:~ pwadas$ [[ -z "" ]] && echo yes 
yes
dtpwmbp:~ pwadas$ [[ -z "ABCD" ]] && echo yes 
dtpwmbp:~ pwadas$ 

在这里,测试字符串的零长度。

于 2012-09-17T23:22:00.273 回答