如何使 grep 的输出失败?

如何使 grep 的输出失败?

我正在使用 if-else 语句搜索关键字并在终端中显示结果,这是我的代码示例。

read finding

if ["$finding" != "" ]; then
   grep $finding information.txt
else
   echo "No such information in database."
fi

但是如果我输入不存在的信息,终端不会显示任何内容。我大约一周前开始使用 shell,可能需要更多关于某些代码如何工作的解释。

答案1

  • 之后添加空格[(这是命令)
  • 用于-n测试字符串长度是否非零,或-z测试它是否为零
  • 在变量两边加上双引号

所以:

read finding

if [ -z "$finding" ]; then
    echo "You didn't enter anything"
else
    grep "$finding" information.txt
    if [ ! "$?" -eq 0 ]; then
        echo "No such information in database."
    fi
fi

答案2

使用一些逻辑运算符(来自@jimmij)

grep -q "$finding" information.txt行为类似于布尔答案(不打印任何内容,如果找到则返回状态为 0,否则返回非零)。

grep -F -- "$finding" ...搜索文本而不是正则表达式(如果您想搜索正则表达式,请将其删除 - 可能存在一些安全风险......(谢谢@StephanChazelas))

read finding

if [ -z "$finding" ]; then
   echo "You didn't enter anything"
else
   grep -qF -- "$finding" information.txt   && echo "found"   || echo "not found"
fi

甚至

[ -z "$finding" ] && 
     echo "nothing entered" || 
     grep -qF -- "$finding" information.txt || echo "not found"

(但要注意,它也会运行第二个grep和/或echo如果第一个echo失败)

编辑1 > explain grep -q ... 当然。

正常情况下,grep 返回状态为 0(如果发生错误(例如未找到文件),则仅返回“非 0”)

grep -qF exp file如果在文件中找到 exp,则“返回”0,否则出错(如果regexp 与 中匹配,grep -q exp file则会执行此操作)。expfile

此行为可用于 bash 控制语句(if、elif、while、&&、|| 等)

read f

if [ -z "$f" ]; then
   echo "You didn't enter anything"
elif grep -qF -- "$f" information.txt; then
   echo "found"
else
   echo "not found"
fi

答案3

i=0
until  [ "$((i+=1))" -gt 5 ] || {
       printf '\nPrompt: '
       read finding && [ -n "$finding" ]
};do   printf '\nINVALID:\tTry again.\n'
done   <>/dev/tty >&0
grep -- "${finding:?INSUFFICIENT INPUT!}" <info.txt ||
! printf '%s:\tNot found in database.' "$finding" >&2

您不仅应该测试它$finding是否不为空,而且还应该测试它是否read成功完成 - 因此首先将其设置。上面的循环将提示并尝试从终端读取一行非空输入,然后退出并出现错误。

  • "${expand:?SUBSTITUTE ONLY IF UNSET OR NULL! >STDERR}"
    • 的空值将作为参数扩展$finding的副作用进行处理,并导致写入消息并立即退出非交互式 shell。${:?}stderr
  • cmd ... <redirected_input_file
    • 尝试从无法打开的文件重定向是语法错误(例如不存在或有效UID/GID没有读取权限)因此,如果info.txt由于某种原因无效,非交互式 shell 会写入诊断消息stderr并立即退出。如果尝试read超出 - 影响的任何限制,这也成立ulimit,并且同样适用于初始until ... done <>in >&out循环。
  • grep ... || ! printf '%s: fmt' "$param"
    • 因为任何用户或文件输入错误在调用之前已经导致 shell 退出grep,所以上述形式的唯一两个可能的结果是至少grep匹配一次模式并写入相应的行,或者甚至不匹配一次并返回 0 以外的值。在后一种情况下,写入一条信息性消息并返回 1。"$finding"stdoutprintfstderr

相关内容