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
-ooperador en lugar de su || anidado. También puede utilizar-apara reemplazar && si es necesario en sus otras declaraciones.fuente
-ay-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?basho cualquier otro shell que entienda[[ ... ]].