Estaba escribiendo un script bash y de repente comenzó este comportamiento:
[[ 1 < 2 ]]; echo $? # outputs 0
[[ 2 < 13 ]]; echo $? # outputs 1
pero -lt
funciona bien:
[[ 1 -lt 2 ]]; echo $? # outputs 0
[[ 2 -lt 13 ]]; echo $? # outputs 0
¿Sobreescribí accidentalmente de <
alguna manera?
Aquí hay un script que escribí para probar este comportamiento:
#!/bin/bash
for a in {1..5}
do
for b in {1..20}
do
[[ $a < $b ]] && echo $a $b
done
echo
done
Aquí está la salida:
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
cambiar <
a -lt
en el script da una salida normal (se 5 10
muestra, por ejemplo).
Reiniciar no cambió nada.
Mi versión bash es GNU bash, versión 4.3.42 (1) -release (x86_64-pc-linux-gnu). Estoy en Ubuntu 15.10. No sé qué otra información es relevante aquí.
<
operación, está haciendo una comparación de cadenas, mientras que el-lt
operador es una comparación numérica. Si observa los resultados que ha enumerado, se dará cuenta. Numéricamente 2 es menor que 10, alfabéticamente, al revés.Respuestas:
De la
bash
página del manual.Desde la salida, parece estar funcionando según lo diseñado.
fuente
Qué tal si:
De acuerdo con http://www.tldp.org/LDP/abs/html/dblparens.html
fuente
En primer lugar,
[[
no es POSIX y debe evitarse.En segundo lugar, si desea utilizarlo
<
como parte de una prueba aritmética, puede hacerlo, pero con una sintaxis diferente:O:
fuente