2011-01-27 25 views

Respuesta

27

Para la comparación numérica, que puede hacer:

if ! (((a == b) && (a == c))) 

Para la comparación de cadenas:

if ! [[ "$a" == "$b" && "$a" == "$c" ]] 

En Bash, los paréntesis dobles establecieron un contexto aritmética (en el que las muestras de dólar son mayormente opcional, por cierto) para una comparación (también se usa en for ((i=0; i<=10; i++)) y $(()) expansión aritmética) y se usa para distinguir la secuencia de un conjunto de paréntesis únicos que crea una subshell.

Esto, por ejemplo, ejecuta el comando true y, ya que es siempre verdad que hace la acción:

if (true); then echo hi; fi 

Esto es lo mismo que

if true; then echo hi; fi 

excepto que se crea un subnivel. Sin embargo, if ((true)) prueba el valor de una variable llamada "verdadera".

Si incluyese un signo de dólar, entonces "$ true" sería inequívocamente una variable, pero el comportamiento if con paréntesis únicos (o sin paréntesis) cambiaría.

if ($true) 

o

if $true 

sería ejecutar el contenido de la variable como un comando y ejecutar la acción condicional basada en el valor de la salida de la orden (o dar un "comando no encontrado" mensaje si el contenido aren no es un comando válido).

if (($true)) 

hace lo mismo como if ((true)) como se describe anteriormente.

+0

Gracias Dennis. Este es exactamente el tipo de sintaxis que estaba buscando –

+0

+1 para la explicación de doble parantheses! Borrando mis otros comentarios para limpiar. – eckes

2
#!/bin/bash 

a=2 
b=3 
c=4 

if ! (((a == b) && (a == c))); then 
    # stuff here 
fi 

También es posible usar los siguientes elementos que personalmente me parece más claro:

#!/bin/bash 

a=2 
b=3 
c=4 

if (((a != b) || (a != c))); then 
    # stuff here 
fi 

Técnicamente hablando no necesitan los parens alrededor de las expresiones sub ya que los operadores de igualdad == != tienen mayor precedencia luego ambos operadores de comparación compuesta && || pero creo que es aconsejable mantenerlos allí para mostrar intención, nada más.

+0

Gracias SiegeX gran explicación aquí! –

4
if [ "$a" != "$b" -o "$a" != "$c" ]; then 
    # ... 
else 
    # ... 
fi 
+1

O, haciendo la traducción directa: 'if [! \\ (\\ ("$ a" = "$ b" \\) -a \\ ("$ a" = "$ c" \\) \\)] '... –

+0

La lógica para invertir los operadores así es [la ley de De Morgan] (http://en.wikipedia.org/wiki/De_Morgan's_laws). – chrisaycock

+0

Gracias Wilhelmtell. Gracias por simplificar la verificación lógica –