Qual é a sintaxe do IF / ELSE no bash?

2

Estou tentando extrair logs e fazer algumas outras coisas diretamente. Escreveu uma pequena linha BASH mas não funciona. Tenho certeza que isso é com a condição 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 ;
    
por rɑːdʒɑ 21.04.2015 / 17:32

3 respostas

6

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ção if

  • Você precisa fechar a condição if usando fi 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.

    
por heemayl 21.04.2015 / 17:36
4

Uma boa ideia é verificar seus scripts com esta ferramenta .

Aqui está uma versão comentada do seu erro:

   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.

Fonte

    
por A.B. 21.04.2015 / 17:46
-2
if [ 'du -sh  /tmp/filename.log' -gt 0 ]; then gzip /tmp/filename.log; fi

Os espaços em if e fi no final para fechar o if

    
por Maythux 21.04.2015 / 17:37