bash 中 IF/ELSE 的语法是什么?

rɑː*_*dʒɑ 3 command-line bash

我正在尝试提取日志并直接做其他一些事情。写了一小行 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)

hee*_*ayl 7

您错过了几点,正确的(仅在语法上)形式是:

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。