Pourquoi l'égalité à l'opérateur ne fonctionne pas s'il n'est pas entouré par l'espace?
J'ai essayé le script suivant
#!/bin/bash
var1="Test 1"
var2="Test 2"
if [ "$var1"="$var2" ]
then
echo "Equal"
else
echo "Not equal"
fi
Il m'a donné Equal
. Mais il faut avoir imprimé Not equal
Seulement quand j'ai inséré l'espace autour de =
cela a fonctionné comme prévu
if [ "$var1" = "$var2" ]
et imprimé Not equal
Pourquoi est-il si? Pourquoi "$var1"="$var2"
est pas le même que "$var1" = "$var2"
?
De plus, quand j'ai écrit if [ "$var1"= "$var2" ]
, il a donné
line 4: [: Test 1=: unary operator expected
Que veut-il dire? Comment se fait-ses attend opérateur unaire?
Vous devez vous connecter pour publier un commentaire.
test
(ou[ expr ]
) est une fonction builtin. Comme toutes les fonctions de bash, vous transmettre les arguments comme des espaces séparés mots.Que la page de manuel de bash les builtins dispose que: "Chaque opérateur et opérande doit être un argument séparé."
C'est juste la façon bash et la plupart des autres shells Unix travail.
Affectation de Variable est différente.
En bash une affectation de variable a la syntaxe:
name=[value]
. Vous ne pouvez pas mettre non cotées espaces autour de la=
parce que bash ne serait pas interpréter cela comme la mission que vous envisagez. bash traite la plupart des listes de mots comme une commande avec des paramètres.E. g.
var = "test" ;
ne fonctionne pas? Pour le faire fonctionner, je dois supprimer les espacesvar="test";
Est d'affectation=
n'est pas un opérateur?test
builtin fonction. En bash une affectation de variable est la partie de la coque de la grammaire, ce n'est pas une fonction. Il ne nécessite pas d'espaces.Lorsque le shell lit
il invoque la commande [ avec 4 arguments. Si [ est un builtin ou une commande externe n'est pas pertinent, mais il peut l'aider à comprendre qu'il peut être la commande externe /bin/[. Le deuxième argument est le littéral '=' et le quatrième est un ']'. Toutefois, lorsque le shell lit
[ ne reçoit que 3 arguments: l'expansion de $var1 avec '=' annexé, l'expansion de $var2, et ']'. Quand il ne reçoit que 3 arguments, il attend le dernier argument ']' et le premier argument d'un opérateur unaire.
À ajouter à l'existant explication,
"$var1"="$var2"
est juste une seule chaîne non vide, et donc s'évalue toujours aussi vrai dans une conditionnelle.La commande ci-dessus va toujours imprimer
true
(même sivar1
etvar2
être vide).En bash le mieux est d'utiliser [[ ]]:
[[
est régie par la même syntaxe shell comme toutes les autres constructions. Commutation de[[
ne résoudrait pas le cas des OP problème. Quant à savoir si c'est "mieux" dépend si vous privilégier le côté pratique de plus de portabilité. Si vous vous êtes engagé à Bash-seulement, c'est probablement vrai.