var="$(command1 -l "$var2" -c "command2|grep -c "search"")" if [[ var !=0 ]]; then fi
Por que estou recebendo “operador binário condicional esperado”. Já procurei e. Vejo que [[]] é uma declaração de teste, mas por que não funcionaria?
Resposta
- Você “está faltando
$
na frente de var quando você chamá-lo, como você escreveu, será literalmentevar
. - Considere possíveis vulnerabilidades de seu script ao usar
[[ ... ]]
ou(( ... ))
junto com variáveis que você não pode controlar. No seu caso, pode ser melhor usar[ "$var" -ne 0 ]
. - Está faltando um espaço entre
!=
e0
(esta é a fonte do erro!) -
!=
é um operador de comparação de string , embora possa funcionar em seu exemplo, você deseja usar-ne
para comparar inteiros.
Use o shellcheck .
Comentários
- Nota t hat
(( var !=0 ))
também funcionaria aqui, mas como[[ "$var" -ne 0 ]]
seria uma vulnerabilidade de injeção arbitrária de comando se a natureza da saída do comando sendo capturado não está sob seu controle. - Obrigado St é phane por seus insights. Você considera
[[ "$var" -ne 0 ]]
inseguro? Que tal o mesmo sem aspas? Então, o que você acha que deve ser preferido? - Em
[[ $var -ne 0 ]]
(com ou sem as aspas, as aspas não sendo necessárias neste caso específico) ou(( var!=0 ))
, o conteúdo de$var
é avaliado como uma expressão aritmética e coisas ruins podem acontecer então .[ "$var" -ne 0 ]
(as aspas são necessárias aqui, pois[
é um comando comum) é seguro embash
(mas não todos os outros shells), pois$var
é interpretado apenas como um inteiro decimal.[ "$var" != 0 ]
(ou o[[ $var != 0 ]]
kshism) também é seguro, mas retornaria verdadeiro se$var
contém00
, pois ' comparação de strings sa.