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
我在 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