我正在尝试提取日志并直接做其他一些事情。写了一小行 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 ;
Run Code Online (Sandbox Code Playgroud)
您错过了几点,正确的(仅在语法上)形式是:
if [ `du -sh /tmp/filename.log` -gt 0 ]; then gzip /tmp/filename.log; fi
Run Code Online (Sandbox Code Playgroud)
test( [) 之后和之前必须有空格]
您需要;在第一个if条件之后放置一个(与换行符同义)
您需要if使用fi最后一部分关闭条件
此外,您应该使用$()`` 代替 `` 作为命令替换,因为后者已被弃用而支持$().
因此,从字面上看,您的命令可以变得更加健壮:
if [ $(du -sh /tmp/filename.log) -gt 0 ]; then gzip /tmp/filename.log; fi
Run Code Online (Sandbox Code Playgroud)
最重要的是,您的if情况还有另一个主要问题,您将字符串(输出du -sh /tmp/filename.log)与整数 ( 0) 进行比较,这是错误的。
您可以执行以下操作:
if [ $(du -s ./test.txt | cut -f1) -gt 0 ]; then gzip /tmp/filename.log; fi
Run Code Online (Sandbox Code Playgroud)
或者干脆:
[ $(du -s ./test.txt | cut -f1) -gt 0 ] && gzip /tmp/filename.log
Run Code Online (Sandbox Code Playgroud)
在最后一个命令中,&&只有在前一个命令返回退出状态0即成功时才会运行后面的命令。所以,你不需要一个if毕竟条件。
此外,如果您正在使用bash,请尝试使用bash关键字[[而不是test [因为它提供了许多没有的功能test。所以你的命令可以采用以下最终形式:
[[ $(du -s ./test.txt | cut -f1) -gt 0 ]] && gzip /tmp/filename.log
Run Code Online (Sandbox Code Playgroud)
或者最简单的方法:
[[ -s /tmp/filename.log ]] && gzip /tmp/filename.log
Run Code Online (Sandbox Code Playgroud)
在-s表明,如果文件大于0在大小,然后将返回true。