¿Cuál es la diferencia entre estos?
SEC=$(mysql -hxxx -Pxxx -uxxx -pxxx -se "SELECT Seconds FROM tablename")
SEC=100
Ambos devuelven el mismo resultado (100). Pero cuando lo pruebo con:
if [ ${SEC} > 1 ]
then
echo "SEC GT 1"
else
echo "SEC LT 1"
fi
El primero regresa:
"SEC GT 1"
El segundo regresa:
"SEC LT 1"
Sin embargo, si lo cambio a:
if [ ${SEC} -gt 1 ]
entonces el resultado se invierte.
Supongo que tiene algo que ver con el tipo de datos y que presumiblemente necesito cast
uno u otro para obtener el mismo resultado.
Es sólo que en este momento está arruinando mis pruebas, ya que tengo que acordarme de cambiar la IF
sección cada vez.
Respuesta1
Originalmente, [
se implementó como un comando ordinario, idéntico a test
excepto que [
espera un argumento adicional al final que debe ser ]
. (Todavía existe como un comando ordinario, pero la mayoría de los shells también los tienen integrados). Dado que es un comando ordinario sujeto a un análisis ordinario, no podría usar operadores matemáticos <
y >
sin comillas: [ ${SEC} > 1 ]
contiene un operador de redirección, es equivalente a [ ${SEC} ] >1
, redirigiendo la salida (vacía) del [
comando al archivo llamado 1
. El [
comando sigue principalmente la convención habitual de crear opciones especiales que comiencen con un guión: la mayoría de sus operadores comienzan con un guión. Por lo tanto, hay [ -r foo ]
que probar si un archivo es legible, [ -r foo -a -w bar ]
combinar dos pruebas con el operador "y", [ $x -eq $y ]
probar si $x
y $y
son iguales, etc.
Estos shells más antiguos tenían igualdad de cadenas (el =
operador, uno de los pocos que se desvía de la convención de guión y letra) pero no ordenamiento de cadenas¹. Sin embargo, tenían comparaciones numéricas, por ejemplo, [ $x -le $y ]
para probar si el número entero $x
es menor o igual a $y
, y este conjunto de operadores incluye igualdad numérica [ $x -eq $y ]
porque [ 010 -eq 8 ]
un cero a la izquierda significa que el número está en octal.
Ksh introdujo la sintaxis [[ … ]]
, ahora también disponible en bash y zsh. A diferencia de [ … ]
, que es un comando normal, [[ … ]]
es reconocido por el analizador del shell, por lo que los caracteres especiales como (
y <
pueden usarse dentro sin comillas (y de hecho, no deben estar entre comillas). Dado que -lt
y los amigos ya estaban disponibles para comparaciones numéricas, y =
ya estaban haciendo una comparación de cadenas, <
y los amigos se convirtieron en operadores de comparación de cadenas (orden lexicográfico¹). Así, por ejemplo, [ 9 -lt 10 ]
pero [[ 10 < 9 ]]
.
¹ El orden de cadenas está disponible con la expr
utilidad; es uno de los pocos usos expr
que no ha sido subsumido por las características de los shells POSIX. Pero tenga en cuenta que expr
utiliza el mismo operador para comparaciones numéricas y de cadenas, así que expr 9 \< 10
pero expr a9 \> a10
.
² Si las cadenas se interpretan como cadenas de bytes o como cadenas de caracteres en la configuración regional actual, depende del shell.