Você perdeu alguns pontos, o formulário correto ( Somente sintaticamente ) seria:
if [ 'du -sh /tmp/filename.log' -gt 0 ]; then gzip /tmp/filename.log; fi
-
Deve haver espaço após
test
([
) e antes de]
-
Você precisa colocar um
;
(sinônimo de nova linha) após a primeira condiçãoif
-
Você precisa fechar a condição
if
usandofi
na última parte
Além disso, você deve usar $()
em vez de '' como substituição de comando, pois a última está em desuso em favor de $()
.
Então, literalmente, seu comando pode se tornar mais robusto:
if [ $(du -sh /tmp/filename.log) -gt 0 ]; then gzip /tmp/filename.log; fi
O mais importante , existe outro grande problema na sua condição if
, você está comparando uma string (saída de du -sh /tmp/filename.log
) com um inteiro ( 0
), o que está errado.
Você pode fazer o seguinte:
if [ $(du -s ./test.txt | cut -f1) -gt 0 ]; then gzip /tmp/filename.log; fi
Ou simplesmente:
[ $(du -s ./test.txt | cut -f1) -gt 0 ] && gzip /tmp/filename.log
No último comando, o comando após &&
será executado somente se o comando anterior retornar um status de saída 0
, ou seja, com êxito. Então, você não precisa de uma condição if
, afinal.
Além disso, se você estiver usando bash
, tente usar a bash
keyword [[
em vez de test
[
, pois ela fornece muitos recursos que test
não oferece. Assim, seu comando pode assumir o seguinte formulário final :
[[ $(du -s ./test.txt | cut -f1) -gt 0 ]] && gzip /tmp/filename.log
Ou a maneira mais simples :
[[ -s /tmp/filename.log ]] && gzip /tmp/filename.log
O -s
indica que, se o arquivo for maior que 0
em tamanho, retornará verdadeiro.