我遇到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
答案 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