web-dev-qa-db-fra.com

opérateur unaire attendu dans le script shell lors de la comparaison de la valeur NULL avec la chaîne

J'ai deux variables

var=""
var1=abcd

Voici mon code de script shell

if [ $var == $var1 ]; then
  do something
else
  do something
fi

Si je lance ce code, un message d'avertissement s'affiche

[: ==: unary operator expected

Comment puis-je résoudre ça?

22
Uvais Ibrahim

Puisque la valeur de $var est la chaîne vide, ceci:

if [ $var == $var1 ]; then

étend à ceci:

if [ == abcd ]; then

qui est une erreur de syntaxe.

Vous devez citer les arguments:

if [ "$var" == "$var1" ]; then

Vous pouvez également utiliser = plutôt que ==; c'est la syntaxe originale, et elle est un peu plus portable.

Si vous utilisez bash, vous pouvez utiliser la syntaxe [[, qui ne nécessite pas de guillemets:

if [[ $var = $var1 ]]; then

Même dans ce cas, citer la référence de la variable et ajouter des guillemets ne font pas de mal:

if [[ "$var" = "$var1" ]]; then

pourrait sauver un moment un futur lecteur en essayant de se rappeler si [[ ... ]] le requiert.

75
Keith Thompson

Pourquoi tout le monde veut utiliser '==' au lieu de simple '='? C'est une mauvaise habitude! Il est utilisé uniquement dans l'expression [[]]. Et dans (()) aussi. Mais vous pouvez utiliser simplement = aussi! Cela fonctionne bien dans tous les cas. Si vous utilisez des nombres, les chaînes n'utilisent pas la parcellisation, puis comparent comme des chaînes, mais comparent les chiffres comme ça

let -i i=5 # garantee that i is nubmber
test $i -eq 5 && echo "$i is equal 5" || echo "$i not equal 5"

Le match est meilleur et plus rapide. Je suis expert en C/C++, Java, JavaScript. Mais si j'utilise bash, je n'utilise jamais '==' à la place '='. Pourquoi tu le fais?

0
Anatoly