【问题标题】:Bash scripting: If command returns nothing and user chooses to retry, repeat commandBash 脚本:如果命令没有返回任何内容并且用户选择重试,则重复命令
【发布时间】: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

}

所以基本上我想要的是:

  1. 提示用户输入模式;
  2. 用户输入模式后,grep 命令将搜索该模式;
  3. 如果未找到该模式,因此 grep 不返回任何内容,系统将提示用户使用不同的模式重试;
  4. 如果用户选择重试,重复整个函数

在我上面介绍的表格中,如果用户选择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 次以搜索不同的模式,然后选择nNo 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


【解决方案1】:

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

【讨论】:

  • 非常感谢,它现在按预期工作。我想到了while循环函数中的所有命令,但想不出一个有效的语法,我还认为它是矫枉过正的,我可以通过只循环部分函数来做到这一点。我不知道if grep "$pattern" "file" 等同于“如果命令返回 0”。我也不知道可以在条件中将read[] 链接起来。你能告诉我: 在这种情况下做了什么吗?它会重复while循环吗?
  • : 是一个没有成功执行任何操作的命令。参数被评估,但仅此而已。很久以前,它是 Bourne shell 中的注释机制(在 Bash 出现之前)。您可能偶尔会发现以: 而不是#! 开头的奇怪古文字;它是一个指示符,用于指示脚本应该由 Bourne shell 而不是 C shell 运行。
猜你喜欢
  • 2013-09-19
  • 2013-08-27
  • 2018-03-06
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多