Bash脚本:如果命令没有返回任何用户选择重试,请重复命令

时间:2014-01-05 01:23:18

标签: bash while-loop user-input

这可能是一个非常简单的问题,但是对于我的生活,我找不到正确的逻辑/语法。我正在努力使这个功能起作用:

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

}

基本上我想要的是:

  1. 提示用户使用模式;
  2. 用户输入模式后,grep命令将搜索该模式;
  3. 如果找不到模式,因此grep什么都不返回,系统会提示用户以不同的模式重试;
  4. 如果用户选择重试,请重复整个功能
  5. 在我上面提到的表单中,如果用户选择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)" ],结果相同。

1 个答案:

答案 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,这些循环应该停止,这是程序的一部分的基本良好行为。