Linha de comando SE não está funcionando como esperado

3

Sou relativamente novo na programação do terminal. Estou tentando executar uma condição IF dentro de um loop FOR . (O comando deve ser executado por um cronjob)

for i in {1..5}; do echo $i; if [ $i>3 ]; then echo $i; fi; done

Eu quero que seja enviado como

1
2
3
4
4
5
5

Mas a saída real desse comando é

1
1
2
2
3
3
4
4
5
5

Alguém poderia me ajudar a apontar o erro?

Obrigado!

    
por aye 29.04.2016 / 14:29

2 respostas

7

[ colchetes são alias para o comando test e não há sinal > no comando de teste regular. Use [ $i -gt 3 ]

$ for i in {1..5}; do echo $i; if  [ $i -gt 3 ] ; then echo $i; fi; done
1
2
3
4
4
5
5

Você também pode usar a expansão aritmética do bash (())

$ for i in {1..5}; do echo $i; if  (( $i>3 )) ; then echo $i; fi; done
1
2
3
4
4
5
5

Você também pode usar expr , mas eu garanto 100% que você continuará esquecendo de \ escapar dos < e > sings, além de redirecionar a saída para /dev/null :

$> if expr 3 \> 2 > /dev/null ; then echo YES; else echo NO ; fi                           
YES
$> if expr 3 \< 2 > /dev/null ; then echo YES; else echo NO ; fi                           
NO
    
por Sergiy Kolodyazhnyy 29.04.2016 / 14:36
2

Editar seu comando para isso deve funcionar:

for i in {1..5}; do echo $i; if [[ $i -gt 3 ]]; then echo $i; fi; done

Como uma melhoria extra, se este comando só for executado no bash, vale a pena usar [[ em vez de [ . Ele faz a mesma coisa, mas tem algumas funcionalidades adicionais adicionais .

    
por Arronical 29.04.2016 / 14:32