var="$(command1 -l "$var2" -c "command2|grep -c "search"")" if [[ var !=0 ]]; then fi
Pourquoi est-ce que jobtiens « opérateur binaire conditionnel attendu ». Jai déjà cherché et. Je vois que [[]] est une instruction de test, mais pourquoi cela ne fonctionnerait-il pas?
Réponse
- Vous « il manque
$devant var quand vous lappelez, comme vous lavez écrit, il sera littéralementvar. - Tenez compte des vulnérabilités possibles de votre script lorsque vous utilisez
[[ ... ]]ou(( ... ))avec des variables que vous ne pouvez pas contrôler. Dans votre cas, il peut être préférable dutiliser[ "$var" -ne 0 ]. - Il vous manque un espace entre
!=et0(cest la source de lerreur!) -
!=est un opérateur de comparaison de chaînes , bien que cela puisse fonctionner dans votre exemple, vous souhaitez utiliser-nepour comparer des entiers.
Utilisez shellcheck .
Commentaires
- Remarque t hat
(( var !=0 ))fonctionnerait également ici, mais comme[[ "$var" -ne 0 ]]serait une vulnérabilité dinjection de commande arbitraire si la nature de la sortie de la commande capturée nest pas sous votre contrôle. - Merci St é phane pour vos informations. Considérez-vous
[[ "$var" -ne 0 ]]comme dangereux? Et la même chose sans guillemets? Alors, quest-ce que vous pensez devrait être préféré? - In
[[ $var -ne 0 ]](avec ou sans les guillemets, les guillemets nétant pas nécessaires dans ce cas particulier) ou(( var!=0 )), le contenu de$varest évalué comme une expression arithmétique et de mauvaises choses peuvent alors se produire .[ "$var" -ne 0 ](les guillemets étant nécessaires ici car[est une commande ordinaire) est en sécurité dansbash(mais pas tous les autres shells), car$varest interprété comme un entier décimal uniquement.[ "$var" != 0 ](ou le[[ $var != 0 ]]kshism) est également sûr mais renverrait true si$varcontient00car ' une comparaison de chaînes.