Eu estava escrevendo um script bash e de repente esse comportamento começou:
[[ 1 < 2 ]]; echo $? # outputs 0
[[ 2 < 13 ]]; echo $? # outputs 1
mas -lt
funciona perfeitamente:
[[ 1 -lt 2 ]]; echo $? # outputs 0
[[ 2 -lt 13 ]]; echo $? # outputs 0
substituí acidentalmente de <
alguma forma?
Aqui está um script que escrevi para testar esse comportamento:
#!/bin/bash
for a in {1..5}
do
for b in {1..20}
do
[[ $a < $b ]] && echo $a $b
done
echo
done
aqui está a saída:
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
1 13
1 14
1 15
1 16
1 17
1 18
1 19
1 20
2 3
2 4
2 5
2 6
2 7
2 8
2 9
2 20
3 4
3 5
3 6
3 7
3 8
3 9
4 5
4 6
4 7
4 8
4 9
5 6
5 7
5 8
5 9
mudar <
para -lt
no script fornece saída normal ( 5 10
aparece por exemplo).
A reinicialização não mudou nada.
Minha versão do bash é o GNU bash, versão 4.3.42 (1) -release (x86_64-pc-linux-gnu). Estou no Ubuntu 15.10. Não sei que outras informações são relevantes aqui.
<
operação, você está fazendo uma comparação de cadeias, enquanto o-lt
operador é uma comparação numérica. Se você observar os resultados listados, perceberá isso. Numericamente 2 é menor que 10, alfabeticamente, ao contrário.Respostas:
Na
bash
página do manual.A partir da saída, parece estar funcionando como projetado.
fonte
E se:
De acordo com http://www.tldp.org/LDP/abs/html/dblparens.html
fonte
Em primeiro lugar,
[[
não é POSIX e deve ser evitado.Em segundo lugar, se você deseja usar
<
como parte de um teste aritmético, pode fazer isso, mas com sintaxe diferente:Ou:
fonte