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-nepara 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$varcontém00, pois ' comparação de strings sa.