Lea que para comparar cadenas en el interior if
necesitamos usar corchetes dobles. Algunos libros dicen que la comparación se puede hacer por =
. Pero también funciona con el ==
.
#!/bin/bash
a="hello"
b="world"
if [[ $a == $b ]];then
echo "equal"
fi
¿Hay alguna diferencia entre =
y ==
en la comparación?
bash
shell-script
usuario3539
fuente
fuente
=
es para[
.==
es para[[
.==
, por lo que debería usar=
(igualdad) con[
, y==
(coincidencia de patrones, con semántica que son comillas)[[
. Verhelp test
vshelp [[
.[ foo == foo ] && echo foo
ciertamente se imprimefoo
, lo que indica que==
funciona con[
. Sin embargo, si por "es para" quieres decir "estaba destinado a ser usado con", entonces tengo una menor objeción.[[
en primer lugar que tiene una comprensión mucho más matizada de tokenización, la división de palabras, etc ...Respuestas:
[[ $a == $b ]]
no es comparación, es coincidencia de patrones. Necesita[[ $a == "$b" ]]
una comparación de igualdad byte a byte.=
es lo mismo que==
en cualquier shell que admita[[...]]
(introducido porksh
).[[...]]
No es lash
sintaxis estándar . El[
comando es estándar y el operador de comparación estándar que existe=
(aunque algunas[
implementaciones también lo reconocen==
).Al igual que en cualquier argumento de cualquier comando, las variables deben ser citadas, entonces:
En estándar
sh
, la coincidencia de patrones se realiza concase
:Para completar, otros operadores similares a la igualdad que puede encontrar en los scripts de shell:
[ "$a" -eq "$b" ]
:[
operador estándar para comparar números enteros decimales. Algunas[
implementaciones permiten espacios en blanco alrededor de los números, algunas permiten expresiones aritméticas arbitrarias, pero eso no es portátil. Portablemente, uno puede usar[ "$((a))" -eq "$((b))" ]
para eso. Vea también[ "$((a == b))" -ne 0 ]
cuál sería el equivalente estándar (excepto que POSIXly, el comportamiento solo se especifica si$a
y$b
contiene constantes enteras) de:((a == b))
, desde ksh y también encontrado enzsh
ybash
, devuelve verdadero si la evaluación de la expresión aritmética almacenada$a
produce el mismo número que el de$b
. Por lo general, eso se usa para comparar números. Tenga en cuenta que existen variaciones entre los shells en cuanto a cómo se evalúan las expresiones aritméticas y qué números son compatibles (por ejemplo, bash y algunas implementaciones / versiones de ksh no admiten coma flotante o tratan los números con ceros iniciales como octales).expr "$a" = "$b"
realiza una comparación numérica si ambos operandos se reconocen como números enteros decimales (algunos permiten espacios en blanco alrededor del número) y, de lo contrario, verifica si los dos operadores de cadena tienen el mismo orden de clasificación. También fallaría para valores de$a
o$b
que sonexpr
operadores como(
,substr
...awk 'BEGIN{exit !(ARGV[1] == ARGV[2])}' "$a" "$b"
: si$a
y$b
se reconocen como números (al menos números enteros decimales y de coma flotante como 1.2, -1.5e-4, se ignoran los espacios en blanco iniciales, algunos también reconocen hexadecimal, octal o cualquier cosa reconocida porstrtod()
), se realiza una comparación numérica. De lo contrario, dependiendo de la aplicación, o es una comparación de cadenas de byte a byte, o como paraexpr
unastrcoll()
comparación, es decir, si$a
y$b
tipo del mismo.Ver también:
fuente
Estos son equivalentes en bash:
Las dos primeras variables $ x no tienen que ser citadas. Bash realiza la división de palabras y la expansión del nombre de ruta dentro de [pero no dentro de [[:
[[ $x = "$y" ]]
es una comparación de cadenas pero[[ $x = $y ]]
es una expresión de coincidencia de patrones:-eq solo debe usarse con números enteros:
Ver también BashFAQ / 031: ¿Cuál es la diferencia entre test, [y [[? .
fuente