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-ne
pour 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$var
est é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$var
est interprété comme un entier décimal uniquement.[ "$var" != 0 ]
(ou le[[ $var != 0 ]]
kshism) est également sûr mais renverrait true si$var
contient00
car ' une comparaison de chaînes.