Veja como depurar algo assim. Eu tenho uma versão simplificada do seu script.
$ cat var_dumper.bash
#!/bin/bash
var1=1
var2=2
if [ ! "$var1" > "$var2" ]; then
echo "I'm inside the if/then"
fi
E nós o rodamos:
$ ./var_dumper.bash
$ ls
var_dumper.bash 2
Assim, podemos ver seu 2
sendo exibido como um arquivo. Esse é o seu problema.
Depuração
Para depurar um script de shell, sempre começo com a opção -x
para o Bash. Você pode executar seu script assim:
$ bash -x ./var_dumper.bash
+ var1=1
+ var2=2
+ '[' '!' 1 ']'
Isso nos diz onde está falhando. A condição if
. Então, o que há de errado com isso? Bem, a primeira pista deve ser o >
. Isso é um operador de redirecionamento, em outros usos no Bash, então é isso que provavelmente está produzindo o arquivo sendo escrito.
Então reformulemos seu exemplo em um único executável:
$ var1=1 var2=2 [ "$var1" > "$var2" ] && echo success || echo failure
success
A próxima pista deve ser, por que ela está retornando um sucesso, 1 não é maior do que 2. Então, o Google e descobrimos que para comparar inteiros no Bash você não usa o operador >
, você está na verdade, suponha que use este: -gt
.
$ var1=1 var2=2 [ "$var1" -gt "$var2" ] && echo success || echo failure
failure
E como você queria que fosse negado, poderíamos colocar o !
de volta em:
$ var1=1 var2=2 [ ! "$var1" -gt "$var2" ] && echo success || echo failure
success
E isso funciona. Então, sua instrução if
corrigida ficaria assim:
if [ ! "$var1" -gt "$var2" ]; then
echo "I'm inside the if/then"
fi
Então, o que havia de errado com >
No seu cenário, você estava usando if [ .... ]
. Esta forma de if / then é a versão compatível com POSIX. Este não suporta o operador >
. O formulário que suporta isso é isto, if [[ .... ]]
. A versão com colchetes duplos é o comando teste estendido mais capaz.
Então, como alternativa:
$ cat var_dumper.bash
#!/bin/bash
var1=1
var2=2
if [[ ! "$var1" > "$var2" ]]; then
echo "I'm inside the if/then"
fi
Também funcionaria:
$ bash -x var_dumper.bash
+ var1=1
+ var2=2
+ [[ ! 1 > 2 ]]
+ echo 'I'\''m inside the if/then'
I'm inside the if/then