bash si instruction ne cesse de changer le deuxième argument en chaîne littérale

0

Donc, je ne sais pas pourquoi il fait ça. Mon instruction if continue à interpréter la deuxième variable comme une chaîne littérale au lieu d'une variable. Voici mon code exact.

lights() {
  bulb1state=$(gatttool -b D8:6F:4B:09:AC:E6 --char-read -a 0x001b)
  echo $bulb1state
  bulb2state=$(gatttool -b DA:5A:4B:09:AC:E6 --char-read -a 0x001b)
  bulb3state=$(gatttool -b AC:E6:4B:07:39:E9 --char-read -a 0x0018)
  bulb4state=$(gatttool -b AC:E6:4B:08:40:50 --char-read -a 0x0018)
  offstate="Characteristic value/descriptor: 00 00 00 00"
  echo $bulb1state
  echo $offstate
  if [ "$offstate" = "$bulb1state" ]; then
    echo $bulb1state
    echo "bulb1 state = off"
    gatttool -b D8:6F:4B:09:AC:E6 --char-write -a 0x001b -n ff000000
    gatttool -b DA:5A:4B:09:AC:E6 --char-write -a 0x001b -n ff000000
    gatttool -b AC:E6:4B:07:39:E9 --char-write -a 0x0018 -n ff000000
    gatttool -b AC:E6:4B:08:40:50 --char-write -a 0x0018 -n ff000000
  fi
}  

Ma sortie:

>lights
Characteristic value/descriptor: 00 00 00 00
Characteristic value/descriptor: 00 00 00 00
Characteristic value/descriptor: 00 00 00 00

Je ne comprends pas pourquoi les 2 derniers relevés d'écho ne s'affichent pas.

Modifier: Il y avait un espace blanc sur bulb1state. Cela me suffit pour trouver un travail, mais je suis toujours curieux de savoir pourquoi le deuxième terme de l'instruction if était interprété comme une chaîne littérale lorsque j'utilisais l'opérateur "=" par opposition à l'opérateur "-eq" . Peu importait également quelle variable était première ou seconde.

RocketTwitch
la source
Peut-être y at-il un espace supplémentaire à la fin dans la chaîne de retour de gatttool (donc dans $bulb1state ).
agold
Les arguments sont traités comme des chaînes littérales parce que c'est ce que [ string1 = string2 ] Est-ce que. le -eq l'opérateur, d'autre part, les traiterait comme des entiers. Que vous attendiez-vous à faire?
Gordon Davisson
@GordonDavisson Je m'attends à ce que chaîne2 soit évaluée car la valeur contenue par $ bulb1state ne l'est pas à "$ bulb1state". Je sais que cela se produit car mon éditeur de texte, vim, modifie la couleur de "$ bulb1state" en couleur de chaîne plutôt qu'en couleur de variable.
RocketTwitch

Réponses:

0

Comme je l'ai commenté, vous pourriez avoir des espaces supplémentaires dans la sortie de gatttool (c'est à dire. $bulb1state ). Pour la comparaison, vous devriez utiliser = ou == (qui sont des équivalents), et pour les nombres -eq, voir cette réponse . Pour ignorer les espaces supplémentaires que vous pouvez faire (voir cette réponse ):

if [[ "$bulb1state" = "$offstate"* ]]; then
  #...
fi
agold
la source
Comme je l'ai dit, pour une raison quelconque, ma deuxième variable est traitée comme une chaîne littérale. L'utilisation de cette déclaration exacte a toujours ce problème. J'ai trouvé une solution de contournement, mais merci pour le commentaire d'espaces blancs.
RocketTwitch