这可能是一个非常简单的问题,但是对于我的生活,我找不到正确的逻辑/语法。我正在努力使这个功能起作用:
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
}
基本上我想要的是:
在我上面提到的表单中,如果用户选择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)" ]
,结果相同。
答案 0 :(得分:2)
识别grep
正在搜索的文件列表时遇到严重问题。就目前而言,用户在标准输入上键入材料,并且必须键入 Control-D 以指示EOF,然后必须重复第二个grep
的过程。这似乎不合理 - 我将假设您将要搜索的文件列表作为参数传递给函数(因此"$@"
命令行上的grep
。
grep
命令在其输入中找到模式时返回状态0,即成功。您可以直接测试此状态。这导致:
function()
{
while read -p "Enter pattern: " pattern
do
if grep "$pattern" "$@"
then break # Pattern found
elif read -p "No results found. Do you want to retry with different pattern (y/n)? " yesno &&
[ "$yesno" = 'y' ]
then : OK - try again
else break # User did not type 'y'
fi
done
}
如果用户在响应任一提示时指示EOF,这些循环应该停止,这是程序的一部分的基本良好行为。