GNU/Linux >> Tutoriales Linux >  >> Linux

¿Múltiples operadores lógicos, ((a || B) &&C), y "error de sintaxis cerca del token inesperado"?

Estoy trabajando con Bash 3 y estoy tratando de formar un condicional. En C/C++, es completamente simple:((A || B) && C) . En Bash, no es así (creo que los autores de Git deben haber contribuido con este código antes de pasar a otros proyectos).

Esto no funciona. Tenga en cuenta que <0 or 1> no es un literal de cadena; significa un 0 o un 1 (generalmente viene 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

Resulta en:

line 322: syntax error near unexpected token `[['

Luego probé:

A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ ([ "$A" -eq "0" ]) || ([ "$B" -ne "0" ]) ] && [ "$C" -eq "0" ]; then ... fi

resulta en:

line 322: syntax error near unexpected token `[['

Parte del problema es que los resultados de la búsqueda son ejemplos triviales y no ejemplos más complejos con condicionales compuestos.

¿Cómo realizo un ((A || B) && C) simple? 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

Respuesta aceptada:

La sintaxis de bash no es similar a C, incluso si una pequeña parte está inspirada en C. No puede simplemente intentar escribir código C y esperar que funcione.

El punto principal de un shell es ejecutar comandos. El comando de corchete abierto [ es un comando que realiza una sola prueba¹. Incluso puedes escribirlo como test (sin el último corchete de cierre). El || y && los operadores son operadores shell, combinan comandos , no pruebas.

Así que cuando escribes

[ [ "$A" -eq "0" ] || [ "$B" -ne "0" ] ] && [ "$C" -eq "0" ]

eso se analiza como

[ [ "$A" -eq "0" ] ||
[ "$B" -ne "0" ] ] &&
[ "$C" -eq "0" ]

que es lo mismo que

test [ "$A" -eq "0" ||
test "$B" -ne "0" ] &&
test "$C" -eq "0"

¿Observa los paréntesis desequilibrados? Sí, eso no es bueno. Su intento con paréntesis tiene el mismo problema:corchetes falsos.

La sintaxis para agrupar comandos son llaves. La forma en que se analizan las llaves requiere un comando completo antes de ellas, por lo que deberá terminar el comando dentro de las llaves con una nueva línea o un punto y coma.

if { [ "$A" -eq "0" ] || [ "$B" -ne "0" ]; } && [ "$C" -eq "0" ]; then …

Hay una forma alternativa que es usar corchetes dobles. A diferencia de los corchetes simples, los corchetes dobles son una sintaxis de shell especial. Delimitan expresiones condicionales. Dentro de corchetes dobles, puede usar paréntesis y operadores como && y || . Dado que los corchetes dobles son sintaxis de shell, el shell sabe que cuando estos operadores están dentro de corchetes, son parte de la sintaxis de expresión condicional, no parte de la sintaxis de comando de shell ordinaria.

if [[ ($A -eq 0 || $B -ne 0) && $C -eq 0 ]]; then …

Si todas sus pruebas son numéricas, todavía hay otra forma, que delimita las expresiones aritméticas. Las expresiones aritméticas realizan cálculos de enteros con una sintaxis muy parecida a la de C.

if (((A == 0 || B != 0) && C == 0)); then …

Puede que encuentres útil mi imprimación para brackets bash.

Relacionado:Debian – Fallo del sistema – ¿caracteres extraños en syslog?

[ se puede utilizar en pescado simple. [[ y (( son específicos de bash (y ksh y zsh).

¹ También puede combinar múltiples pruebas con operadores booleanos, pero esto es engorroso de usar y tiene trampas sutiles, por lo que no lo explicaré.


Linux
  1. ¿Carga de bibliotecas compartidas y uso de RAM?

  2. Bash:¿Error de sintaxis cerca del token inesperado '}'?

  3. ¿Ssh a múltiples hosts y ejecutar un comando?

  4. Error de alquitrán:EOF inesperado en el archivo

  5. error de sintaxis cerca del token inesperado ' - bash

Cómo hacer Grep para múltiples cadenas y patrones

Cómo instalar y configurar múltiples motores de ajedrez en XBoard

Copia de seguridad y restauración de instantáneas LVM en Linux

Explicado:entrada, salida y redirección de errores en Linux

Encuentre múltiples archivos y cámbieles el nombre en Linux

Error de sintaxis cerca del token inesperado 'entonces'