grep与shell脚本中的if语句有关

时间:2017-01-07 02:01:59

标签: bash shell if-statement grep tail

我遇到INT 21H&问题。 shell脚本if语句中的tail。如果我在shell中运行grep,它会按预期运行,但在此shell脚本中if语句:

tail -5 mylog.log | grep -c "Transferred:            0"

我得到了

# 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

两个grep行。

很明显,关闭... [: missing `]' grep: ]: No such file or directory 被视为grep的一部分(因而失踪),但我正在使用正确的空格,所以我无法弄清楚发生了什么?我在这里做错了什么?

谢谢, PJ

1 个答案:

答案 0 :(得分:4)

立即发布/立即修复

取出括号。

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

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

因此,您的原始代码正在运行[ tail -1 "$logfile",并将其结果汇总到grep -q "Failed" ]。第一个[失败了,因为它没有看到结尾] - 当被该名称而不是名称test调用时是强制性的 - 并且还因为它参数不是测试它知道如何解析;而第二个grep并不知道它被管道传输的]意味着什么,试图找到一个名称的文件。

其他注释

尝试尽可能少地运行外部命令 - 如tail。这是一个非常重要的启动成本。

请考虑以下内容,它只运行一次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