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