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

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 ;

答案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

相关内容