Estoy trabajando con Bash 3, y estoy tratando de formar un condicional. En C / C ++, es muy simple:((A || B) && C)
. En Bash, está resultando que no es así (creo que los autores de Git deben haber contribuido con este código antes de pasar a otros esfuerzos).
Esto no funciona. Tenga en cuenta que <0 or 1>
no es una cadena literal; significa un 0 o 1 (generalmente proviene de grep -i
).
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ [ "$A" -eq "0" ] || [ "$B" -ne "0" ] ] && [ "$C" -eqe "0" ]; then ... fi
En resultado de:
line 322: syntax error near unexpected token `[['
Entonces intenté:
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ ([ "$A" -eq "0" ]) || ([ "$B" -ne "0" ]) ] && [ "$C" -eq "0" ]; then ... fi
en resultado de:
line 322: syntax error near unexpected token `[['
Parte del problema es que los resultados de búsqueda son ejemplos triviales, y no los ejemplos más complejos con condicionales compuestos.
¿Cómo realizo un simple ((A || B) && C)
en Bash?
Estoy listo para desenrollarlo y repetir los mismos comandos en varios bloques:
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ "$A" -eq "0" ] && [ "$C" -eq "0" ]; then
...
elif [ "$B" -ne "0" ] && [ "$C" -eq "0" ]; then
...
fi
[[ … ]]
fue agregado en bash 2.02.((…))
fue agregado en bash 2.0.||
y&&
el cambio de[
a[[
y((
. Igual precedencia en[
(use paréntesis para controlar el orden de evaluación), pero && tiene mayor precedencia en[[
y((
que||
(como en C).Uso
[[
:Si lo prefiere
[
, lo siguiente funciona:fuente
Use el
-o
operador en lugar de su || anidado. También puede utilizar-a
para reemplazar && si es necesario en sus otras declaraciones.fuente
-a
y-o
, pero no experimenté con ellos. Alguien en Stack Overflow dijo que lo evitara. Principalmente estuve de acuerdo con ellos, ya que el script es menos legible al usarlos.[[ ( "$A" -eq "0" || "$B" -ne "0" ) && "$C" -eq "0" ]]
problemas?bash
o cualquier otro shell que entienda[[ ... ]]
.