Estoy haciendo una comparación de enteros en bash (tratando de ver si el usuario se está ejecutando como root), y encontré dos diferentes formas de hacerlo:
Doble es igual a:
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 «sa -eq?
¿Hay alguna diferencia en la forma en que compara ambos lados?
Comentarios
Respuesta
== es un bash -alias específico para =, que realiza una comparación de cadenas (léxica) en lugar de la -eq comparación numérica. (Es al revés de Perl: los operadores de estilo de palabra son numéricos, los simbólicos léxicos.)
Comentarios
- ¿Eso significa que si ambos lados son números enteros, convierte ambos lados en cadenas y luego las compara?
- Más precisamente ' es al revés: todo es una cadena,
-eqle dice abashque interprete las cadenas como enteros (produciendo0sin una advertencia si una cadena isn ' t numérico). - @tjameson Para dar un ejemplo:
[ 01 -eq 1 ]pero[ 01 != 1 ]. - Tenga en cuenta que aunque
==como operador[no es estándar y debe no se puede usar, no es específico de bash . Fue introducido por ksh y también es compatible con zsh (aunque es necesario citar el primer=) , yash y la utilidad GNU[( y cualquier utilidad implementada como scripts ksh en algunos sistemas) al menos). - @geekosaur Recibo una advertencia de bash v4.3.42 si mi cadena no es ' t numérico:
$ if [ "hello" -eq 0 ]; then echo true; fibash: [: hola: se espera una expresión entera
Respuesta
Para ampliar la respuesta de bollovan …
No hay >= o <= operador de comparación para cadenas. Pero puede usarlos con el comando aritmético ((...)) para comparar enteros.
También puede usar los otros operadores de comparación de cadenas (==, !=, <, >, pero no =) para comparar enteros si los usa dentro de ((...)).
Ejemplos
- Tanto
[[ 01 -eq 1 ]]y(( 01 == 1 ))son números enteros comparaciones. Ambos son verdaderos. - Tanto
[[ 01 == 1 ]]como[ 01 = 1 ]realizan comparaciones de cadenas. Ambos son falsos. - Tanto
(( 01 -eq 1 ))como(( 01 = 1 ))devolverán un error.
Nota: La sintaxis de corchetes dobles [[...]] y la sintaxis de paréntesis dobles ((...)) no son compatibles con todos los shells.
Comentarios
- Tenga en cuenta que (excepto
mksh/zsh(excepto en el modo POSIX (aunque ' no es una función POSIX))),(( 010 == 10 ))devolvería falso porque010se trataría como un número octal (8 en decimal). - Tenga en cuenta que aunque la mayoría de
test/[las implementaciones no ' no tienen operadores>=/<=(yash' s[tiene),exprtiene tales operadores, aunque hará ar comparación tmética si los argumentos se reconocen como números (expr 01 '>=' 1devuelve verdadero,expr X01 '>=' X1devuelve falso).
Respuesta
Si desea hacer una comparación de enteros, será mejor que use (()), donde también puede usar> = etc.
Ejemplo:
if (( $UID == 0 )); then echo "You are root" else echo "You are not root" fi
Comentarios
- O
(( UID == 0 ))o(( ! UID ))para eso. Tenga en cuenta que((...))no es estándar (una funciónkshtambién es compatible conbashyzshcon variaciones).
[ $UID -eq 0 ], no[ $UID -eq 0].