query else bad bash if-statement flags

bad - if else en bash



La instrucción Bash if con múltiples condiciones arroja un error (4)

Intenta seguir

if ([ $dateR -ge 234 ] && [ $dateR -lt 238 ]) || ([ $dateR -ge 834 ] && [ $dateR -lt 838 ]) || ([ $dateR -ge 1434 ] && [ $dateR -lt 1438 ]) || ([ $dateR -ge 2034 ] && [ $dateR -lt 2038 ]) ; then echo "WORKING" else echo "Out of range!"

Intento escribir un script que verifique dos indicadores de error, y en caso de que se cambie un indicador (o ambos), se producirá un error echo--. Mi guion

my_error_flag=0 my_error_flag_o=0 do something..... if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then echo "$my_error_flag" else echo "no flag" fi

Básicamente, debería ser, algo así:

if ((a=1 or b=2) or (a=1 and b=2)) then display error else no error fi

El error que recibo es:

line 26: conditional binary operator expected line 26: syntax error near `]'' line 26: `if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then''

¿Mis corchetes están en mal estado?


Puede obtener algo de inspiración leyendo un script entrypoint.sh escrito por los colaboradores de MySQL que verifica si se establecieron las variables especificadas.

Como muestra la secuencia de comandos, puede canalizarlos con -a , por ejemplo:

if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then ... fi


Puede usar cualquiera de las palabras [[ o (( . Cuando usa [[ palabra clave, tiene que usar operadores de cadena como -eq , -lt . Creo, (( es el más preferido para la aritmética, porque puede usar directamente operadores tales como == , < y > .

Usando el operador [[

a=$1 b=$2 if [[ a -eq 1 || b -eq 2 ]] || [[ a -eq 3 && b -eq 4 ]] then echo "Error" else echo "No Error" fi

Usando (( operador

a=$1 b=$2 if (( a == 1 || b == 2 )) || (( a == 3 && b == 4 )) then echo "Error" else echo "No Error" fi

No utilice los operadores -a o -o ya que no es portátil.


Use -a (para y) y -o (para o) operaciones.

tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html

Actualizar

En realidad, aún puedes usar && y || con la operación -eq . Entonces tu script sería así:

my_error_flag=1 my_error_flag_o=1 if [ $my_error_flag -eq 1 ] || [ $my_error_flag_o -eq 2 ] || ([ $my_error_flag -eq 1 ] && [ $my_error_flag_o -eq 2 ]); then echo "$my_error_flag" else echo "no flag" fi

Aunque en su caso puede descartar las dos últimas expresiones y simplemente quedarse con una o una operación como esta:

my_error_flag=1 my_error_flag_o=1 if [ $my_error_flag -eq 1 ] || [ $my_error_flag_o -eq 2 ]; then echo "$my_error_flag" else echo "no flag" fi