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