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
ifusandofina ú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.