Quiero hacer algo como lo siguiente en script bash. ¿Cómo lo implemento en la sintaxis bash?usando condiciones compuestas en script de shell bash
if !((a==b) && (a==c))
then
do something
end if
Quiero hacer algo como lo siguiente en script bash. ¿Cómo lo implemento en la sintaxis bash?usando condiciones compuestas en script de shell bash
if !((a==b) && (a==c))
then
do something
end if
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.
#!/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.
Gracias SiegeX gran explicación aquí! –
if [ "$a" != "$b" -o "$a" != "$c" ]; then
# ...
else
# ...
fi
O, haciendo la traducción directa: 'if [! \\ (\\ ("$ a" = "$ b" \\) -a \\ ("$ a" = "$ c" \\) \\)] '... –
La lógica para invertir los operadores así es [la ley de De Morgan] (http://en.wikipedia.org/wiki/De_Morgan's_laws). – chrisaycock
Gracias Wilhelmtell. Gracias por simplificar la verificación lógica –
Gracias Dennis. Este es exactamente el tipo de sintaxis que estaba buscando –
+1 para la explicación de doble parantheses! Borrando mis otros comentarios para limpiar. – eckes