我正在尝试提取日志并直接做一些其他事情。写了一小行 BASH 但不起作用。我确信那是 IF 条件。
sed -rne '/21:25:07/,/21:50:07/ p' server.log.2015-04-21 > /tmp/filename.log ;
du -sh /tmp/filename.log ;
if [`du -sh /tmp/filename.log` -gt 0] then gzip /tmp/filename.log ;
答案1
你错过了几个点,正确的是(仅在句法上) 形式为:
if [ `du -sh /tmp/filename.log` -gt 0 ]; then gzip /tmp/filename.log; fi
test
([
)之后和之前必须有空格]
您需要在第一个条件
;
后放置一个(与换行符同义)if
您需要
if
使用fi
最后一部分来关闭条件
此外,您应该使用$()
而不是 `` 作为命令替换,因为后者已被弃用,而倾向于使用$()
。
因此,实际上你的命令可以变得更加强大:
if [ $(du -sh /tmp/filename.log) -gt 0 ]; then gzip /tmp/filename.log; fi
最重要的是,您的条件中还有另一个主要问题if
,您正在将字符串(的输出du -sh /tmp/filename.log
)与整数(0
)进行比较,这是错误的。
您可以执行以下操作:
if [ $(du -s ./test.txt | cut -f1) -gt 0 ]; then gzip /tmp/filename.log; fi
或者简单来说:
[ $(du -s ./test.txt | cut -f1) -gt 0 ] && gzip /tmp/filename.log
在最后一条命令中,只有当前一条命令返回退出状态(即成功)时,后面的命令&&
才会运行。所以,你根本0
不需要条件。if
此外,如果您正在使用bash
,请尝试使用bash
关键字[[
而不是 ,test
[
因为它提供了很多test
没有的功能。因此您的命令可以采用以下方式最终形态:
[[ $(du -s ./test.txt | cut -f1) -gt 0 ]] && gzip /tmp/filename.log
或者最简单的方法:
[[ -s /tmp/filename.log ]] && gzip /tmp/filename.log
表示-s
如果文件0
大小大于则返回 true。
答案2
一个好主意是检查他的脚本此工具。
这是您的错误的注释版本:
1 #!/bin/bash
2 sed -rne '/21:25:07/,/21:50:07/ p' server.log.2015-04-21 > /tmp/filename.log ;
3 du -sh /tmp/filename.log ;
4 if [`du -sh /tmp/filename.log` -gt 0] then gzip /tmp/filename.log ;
^––SC1009 The mentioned parser error was in this if expression.
^––SC1073 Couldn't parse this test expression.
^––SC1035 You need a space after the [ and before the ].
^––SC1020 You need a space before the ].
^––SC1072 Missing space before ]. Fix any mentioned problems and try again.
答案3
if [ `du -sh /tmp/filename.log` -gt 0 ]; then gzip /tmp/filename.log; fi
if 条件中的空格和末尾的 fi 用于关闭 if