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 unbash
alias específico para=
, que realiza una comparación de cadena (léxica) en lugar de la-eq
comparació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
-eq
le dicebash
que interprete las cadenas como enteros (produciendo0
sin 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; fi
bash: [: 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 se010
trataría como un número octal (8 en decimal).test
/[
implementaciones no tienen>=
/<=
operadores (yash
's[
tiene sin embargo),expr
tiene 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 '>=' 1
devuelve true,expr X01 '>=' X1
devuelve 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 (unaksh
característica también compatible conbash
yzsh
con variaciones).