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
- Usted «falta
$
delante de var cuando lo llames, como lo escribiste, será literalmentevar
. - 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 ]
. - Le falta un espacio entre
!=
y0
(¡esta es la fuente del error!) -
!=
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 enbash
(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
contiene00
ya que ' es una comparación de cadenas.