shell 脚本中的 if 语句的 Grep 问题

Grep issues with if statement in shell script

我在 shell 脚本 if 语句中遇到 tail & grep 问题。如果我在 shell 中 运行 tail -5 mylog.log | grep -c "Transferred: 0",它应该是 运行,但是在这个 shell 脚本中 if 语句:

# Parse log for results
if [ tail -1 "$LOGFILE" | grep -c "Failed" ] ; then
        RESULT=$(tail -1 "$LOGFILE")
elif [ tail -5 "$LOGFILE" | grep -c "Transferred:            0" ] ; then
        RESULT=""
else
        RESULT=$(tail -5 "$LOGFILE")
fi

我明白了

... [: missing `]'
grep: ]: No such file or directory

对于两条 grep 行。

这显然与关闭 ] 被视为 grep 的一部分(因此丢失)有关,但我使用了正确的空格所以我无法弄清楚发生了什么?我在这里做错了什么?

谢谢, PJ

立即发布/立即修复

去掉括号。

if tail -1 "$logfile" | grep -q "Failed" ; then

[ 不是 if 语法的一部分。相反,它是名为 test 的命令的同义词(通常可作为 shell 内置命令和外部二进制文件使用,如 /bin/test/usr/bin/test)。

因此,您的原始代码是 运行ning [ tail -1 "$logfile",并将其结果传递给 grep -q "Failed" ]。第一个 [ 失败是因为它没有看到结尾 ] —— 当用那个名字而不是名字 test 调用时这是强制性的 —— 也因为它的参数是'它知道如何解析的测试;第二个 grep 不知道正在通过管道传输的 ] 是什么意思,试图找到该名称的文件。


其他注意事项

尝试运行外部命令——比如tail——尽可能少。启动成本非常高。

考虑以下 运行s tail 只有一次:

#!/bin/bash
#      ^^^^- IMPORTANT: bash, not /bin/sh

last_5_lines="$(tail -5 "$logfile")"
last_line="${last_5_lines##*$'\n'}"
if [[ $last_line = *Failed* ]]; then
  result=$last_line
elif [[ $last_5_lines =~ 'Transferred:'[[:space:]]+'0' ]]; then
  result=''
else
  result=$last_5_lines
fi