Diferencia entre '>' y '-gt'

Diferencia entre '>' y '-gt'

¿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 castuno 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 IFsección cada vez.

Respuesta1

Originalmente, [se implementó como un comando ordinario, idéntico a testexcepto 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 $xy $yson 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 $xes 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 -lty 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 exprutilidad; es uno de los pocos usos exprque no ha sido subsumido por las características de los shells POSIX. Pero tenga en cuenta que exprutiliza el mismo operador para comparaciones numéricas y de cadenas, así que expr 9 \< 10pero 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.

información relacionada