Estoy haciendo una comparación de enteros en bash (tratando de ver si el usuario se está ejecutando como root), y encontré dos formas diferentes de hacerlo:
Doble igual:
if [ $UID == 0 ]
then
fi
-eq
if [ $UID -eq 0 ]
then
fi
Entiendo que no hay> = o <= en bash, solo -ge y -le, entonces ¿por qué hay un ==si hay un -eq?
¿Hay alguna diferencia en la forma en que compara ambos lados?
bash
shell
arithmetic
beatgammit
fuente
fuente

[ $UID -eq 0 ]no[ $UID -eq 0].Respuestas:
==es unbashalias específico para=, que realiza una comparación de cadena (léxica) en lugar de la-eqcomparación numérica. (Está al revés desde Perl: los operadores de estilo de palabra son numéricos, los simbólicos son léxicos).fuente
-eqle dicebashque interprete las cadenas como enteros (produciendo0sin advertencia si una cadena no es numérica).[ 01 -eq 1 ]pero[ 01 != 1 ].==como un[operador no es estándar y no debe ser utilizado, no es específica de Bash . Fue introducido por ksh y también es compatible con zsh (aunque=es necesario citar el primero ), yash y la[utilidad GNU (y cualquiera de esas utilidades implementadas como scripts ksh en algunos sistemas) al menos).$ if [ "hello" -eq 0 ]; then echo true; fibash: [: hello: expresión entera esperadaPara elaborar sobre la respuesta de Bollovan ...
No existe
>=o<=operador de comparación de cadenas. Pero podría usarlos con el((...))comando aritmético para comparar enteros.También puede utilizar los otros operadores de comparación de cadenas (
==,!=,<,>, pero no=) para comparar números enteros si se utilizan en el interior((...)).Ejemplos
[[ 01 -eq 1 ]]y(( 01 == 1 ))hacen comparaciones enteras. Ambas son ciertas.[[ 01 == 1 ]]y[ 01 = 1 ]hacer comparaciones de cuerdas. Ambos son falsos.(( 01 -eq 1 ))y(( 01 = 1 ))devolverá un error.Nota: la sintaxis de
[[...]]paréntesis doble y la sintaxis de paréntesis dobles((...))no son compatibles con todos los shells.fuente
mksh/zsh(excepto en modo POSIX (aunque no es una función POSIX))),(( 010 == 10 ))devolvería falso porque se010trataría como un número octal (8 en decimal).test/[implementaciones no tienen>=/<=operadores (yash's[tiene sin embargo),exprtiene este tipo de operadores, a pesar de que va a hacer la comparación aritmética si los argumentos son reconocidos como números (expr 01 '>=' 1devuelve true,expr X01 '>=' X1devuelve False).Si desea hacer una comparación de enteros, usará mejor (()), donde también puede usar> = etc.
Ejemplo:
fuente
(( UID == 0 ))o(( ! UID ))para eso importa. Tenga en cuenta que((...))no es estándar (unakshcaracterística también compatible conbashyzshcon variaciones).