【发布时间】:2014-01-05 01:23:17
【问题描述】:
这可能是我面临的一个非常简单的问题,但我终其一生都找不到正确的逻辑/语法。我正在尝试使此功能起作用:
function ()
{
read -p "Enter pattern: " pattern
grep $pattern
if [ -z "$(grep $pattern)" ]; then
read -p "No results found. Do you want to retry with different pattern (y/n)? " yesno
if [ $yesno = y ]; then
function
fi
}
所以基本上我想要的是:
- 提示用户输入模式;
- 用户输入模式后,grep 命令将搜索该模式;
- 如果未找到该模式,因此 grep 不返回任何内容,系统将提示用户使用不同的模式重试;
- 如果用户选择重试,重复整个函数
在我上面介绍的表格中,如果用户选择y,函数会重复,但即使 grep 找到了一些东西,它也会无限循环,重新提示用户输入模式等。
我试过了:
while [ -z "$(grep $pattern)" ]
do
read -p "No results found. Do you want to retry with different pattern (y/n)? " yesno
if [ $yesno = y ]; then
function
else
break
fi
done
在这个版本中,它几乎可以工作,除了如果用户选择y 3 次以搜索不同的模式,然后选择n,No results found. Do you want to retry with different pattern (y/n)? 提示将重复 3 次,并且仅在此之后函数将退出。
我尝试了until [ -n "$(grep $pattern)" ],结果相同。
【问题讨论】:
-
请注意,您的
grep命令是从标准输入读取的,除非用户键入多个单词作为模式(在这种情况下,它会在由第二个和后面的话)。事实上,你尝试做两次grep。而且您的代码在语法上不正确;您在第一个函数中缺少fi。 -
对不起,忘记在第一个函数中包含 fi,我编辑了,但它在脚本中是正确的。用户输入将始终是一个单词,因此无需担心。
-
如果这是一个生产脚本,您将不得不担心用户不会输入一个单词。程序崩溃,或成为病毒等的目标,因为它们没有注意正确处理输入。
标签: bash while-loop user-input