Por curiosidad, al hacer una comparación de variables bash (su valor es un integer
) es posible probarlo con algún valor predefinido, ya sea declarado como int
o como a string
.
Script de muestra :
#!/bin/bash
f1()
{
[ "$1" == "1" ] && echo "$FUNCNAME: \"1\" compared as string"
}
f2()
{
[[ "$1" -eq 1 ]] && echo "$FUNCNAME: \"1\" compared as int"
}
f1 $1
f2 $1
Salida :
$ ./param.sh 1
f1: "1" compared as string
f2: "1" compared as int
y
$ ./param.sh blah
$
Ambas funciones se comportan de la misma manera, por lo que me pregunto si hay una forma preferida al verificar una variable entera. Iría a comprobar int
versus, int
ya que es más estricto, pero me pregunto si hay algún inconveniente al hacerlo string
.
En este caso, f2()
también es más estricto acerca de la comparación, es decir, pasar un valor decimal lo romperá, mientras f1()
que no tendrá ningún problema.
Respuestas:
Sí, muchas diferencias. Por ejemplo,
=
verifica la igualdad de cadena exacta, pero-eq
evalúa ambas expresiones aritméticamente antes de verificar la igualdad:Además, la cadena vacía pasa a ser numéricamente igual a cero:
Y aparece una clase completamente diferente de diferencias cuando incorporas los operadores de comparación, considerando
<
vs-lt
, por ejemplo:Esto se debe a que la cadena "2" está alfabéticamente después de la cadena "10" (ya que 1 viene antes que 2), pero el número "2" es numéricamente menor que el número "10".
fuente
(( ... ))
para operaciones numéricas.(( " 1 " == 1 )) && echo yes || echo no
resultados enyes
La comparación de enteros frente a cadenas se vuelve más significativa cuando se compara mayor o menor que:
El primero falla porque el 9 viene después del 11 cuando se ordena lexicográficamente.
Tenga en cuenta que el uso de comillas no determina si está comparando cadenas o números, el operador sí. Puede agregar o eliminar las citas anteriores, no hace ninguna diferencia. Bash captura variables indefinidas entre corchetes dobles, por lo que las comillas no son necesarias. El uso de comillas con corchetes simples para las pruebas numéricas no le ahorrará ya que:
es un error de todos modos ("se requiere una expresión entera"). Las cotizaciones son una protección efectiva con comparaciones de cadenas entre paréntesis individuales:
Nota en dobles corchetes,
""
lo hará-eq 0
, pero no== 0
.fuente
[[
es lo suficientemente inteligente como para recordar dónde están las variables, y no se dejará engañar por las variables vacías. Los corchetes simples ([
) no tienen esta característica y requieren comillas.[[ -lt 11 ]]
es un error, peronothing=; [[ $nothing -lt 11 ]]
no lo es. He reelaborado un poco el último párrafo.Además de lo dicho.
Comparar la igualdad es más rápido con los números, aunque en las secuencias de comandos de shell es raro que necesite un cálculo rápido.
fuente
=
, ya que usarla-eq
también coincidiría con "+123". Si desea saber "¿Esta variable, cuando se evalúa como una expresión aritmética, se compara igual a 123", solo puede usarla-eq
. El único momento en que puedo ver dónde a un programador no le importaría qué definición de igualdad se usó es cuando sabe que el contenido de la variable está restringido a un patrón particular con anticipación.b=234
) se ajusta a ese patrón: sabe que no es +234 o "234" o "233 + 1", ya que lo asignó usted mismo, por lo que sabe que compararlo como una cadena y como un número son igualmente válidos. Pero el guión del OP, ya que toma la entrada como un argumento de línea de comando, no tiene esa restricción - considere llamarlo como./param.sh 0+1
o./param.sh " 1"