Estoy tratando de escribir un script que verificará dos marcas de error, y en caso de que se cambie una bandera (o ambas), hará eco: se produjo un error. Mi guión:
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 junto:
if ((a=1 or b=2) or (a=1 and b=2))
then
display error
else
no error
fi
El error que obtengo 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'
¿Están arruinados mis soportes?
bash
if-statement
flags
Simplemente yo
fuente
fuente
a==1 or b==2
ya cubre el caso dondea==1 and b==2
. Probar por separado para eso es completamente superfluo aquí.Respuestas:
Utilice
-a
(para y) y-o
(para o) operaciones.tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html
Actualizar
En realidad, aún podría usar
&&
y||
con la-eq
operación. Entonces su guión sería así:Aunque en su caso puede descartar las dos últimas expresiones y simplemente seguir con una u operación como esta:
fuente
[
y]
para la agrupación (no lo hacen), y no poner espacios alrededor del operador (por ejemplo"$my_error_flag"="1"
), lo que impide que el shell lo reconozca como un operador. Lea BashFAQ # 17 (sobre agrupación) y # 31 (sobre la diferencia entre los diferentes tipos de expresión de prueba) . En realidad, en este caso sería aún más fácil usar una expresión aritmética .-a
y-o
se consideran obsoletos por la especificación POSIX ; use pruebas separadas combinadas con las||
de la actualización.{}
también debería ser posible agrupar usando .Puede usar cualquiera
[[
o((
palabra clave. Cuando se utiliza[[
la palabra clave, usted tiene a los operadores el uso de cadenas, tales como-eq
,-lt
. Creo que((
es el más preferido para la aritmética, porque puedes usar operadores directamente como==
,<
y>
.Usando
[[
operadorUsando
((
operadorNo utilice
-a
ni-o
operadores ya que no es portátil.fuente
Por favor intente seguir
fuente
( ... )
crea subcapas: un gran impacto en el rendimiento sin ningún beneficio.{ ...; }
para agrupar sin creación de subshell.Puede obtener algo de inspiración leyendo un
entrypoint.sh
script escrito por los contribuyentes de MySQL que verifica si se establecieron las variables especificadas.Como muestra el script, puede canalizarlos
-a
, por ejemplo:fuente
-a
está marcado como obsoleto en la versión actual deltest
estándar POSIX ; vea losOB
marcadores en pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html . Use[ -z "$FOO" ] && [ -z "$BAR" ]
para tener un código más confiable.