Se esperaba un operador binario condicional

var="$(command1 -l "$var2" -c "command2|grep -c "search"")" if [[ var !=0 ]]; then fi 

¿Por qué obtengo el «operador binario condicional esperado»? Ya busqué y. Veo que [[]] es una declaración de prueba, pero ¿por qué no funcionaría?

Responder

  1. Usted «falta $ delante de var cuando lo llames, como lo escribiste, será literalmente var.
  2. Considere posibles vulnerabilidades de su secuencia de comandos cuando utilice [[ ... ]] o (( ... )) junto con variables que no puede controlar. En su caso, sería mejor usar [ "$var" -ne 0 ].
  3. Le falta un espacio entre != y 0 (¡esta es la fuente del error!)
  4. != es un operador de comparación de cadenas , aunque podría funcionar en su ejemplo, desea usar -ne para comparar enteros.

Utilice shellcheck .

Comentarios

  • Nota t hat (( var !=0 )) también funcionaría aquí, pero como [[ "$var" -ne 0 ]] sería una vulnerabilidad de inyección de comando arbitraria si la naturaleza de la salida del comando que se captura no está bajo su control.
  • Gracias St é phane por sus ideas. ¿Considera que [[ "$var" -ne 0 ]] no es seguro? ¿Qué pasa con lo mismo sin comillas? Entonces, ¿qué crees que debería preferirse?
  • En [[ $var -ne 0 ]] (con o sin las comillas, las comillas no son necesarias en este caso particular) o (( var!=0 )), el contenido de $var se evalúa como expresiones aritméticas y pueden ocurrir cosas malas en ese momento . [ "$var" -ne 0 ] (las comillas son necesarias aquí ya que [ es un comando ordinario) es seguro en bash (pero no todos los demás shells), ya que $var se interpreta solo como un entero decimal. [ "$var" != 0 ] (o el [[ $var != 0 ]] kshism) también es seguro, pero devolvería verdadero si $var contiene 00 ya que ' es una comparación de cadenas.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *