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

我试图直接拉日志和做其他一些事情。 写了一小行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 ; 

你错过了几个点,正确的( 只有合成的 )forms将是:

 if [ `du -sh /tmp/filename.log` -gt 0 ]; then gzip /tmp/filename.log; fi 
  • test后( [ )和之前必须有空格]

  • 你需要放一个; (首先if条件后的同义词)

  • 您需要在最后一部分使用fi关闭if条件

你也应该使用$()而不是“作为命令替换,因为后者不赞成使用$()

所以,字面上你的命令可以变得更强大:

 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不具备的function]。 所以你的命令可以采取以下最终forms

 [[ $(du -s ./test.txt | cut -f1) -gt 0 ]] && gzip /tmp/filename.log 

或者最简单的方法

 [[ -s /tmp/filename.log ]] && gzip /tmp/filename.log 

-s表示如果文件大小大于0 ,则返回true。

一个好主意是用这个工具检查他的脚本。

以下是您的错误的带注释版本:

  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. 

资源

 if [ `du -sh /tmp/filename.log` -gt 0 ]; then gzip /tmp/filename.log; fi 

if条件中的空格和最后的fi关闭if