bash ifステートメントが2番目の引数をリテラル文字列に変更し続ける


0

だから、なぜこれをしているのか分かりません。私のifステートメントは、2番目の変数を変数ではなくリテラル文字列として解釈し続けます。以下は私の正確なコードです。

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
}  

私の出力:

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

最後の2つのechoステートメントが表示されない理由がわかりません。

編集:bulb1stateに空白がありました。これは回避策を見つけるのに十分ですが、「-eq」演算子ではなく「=」演算子を使用したときにifステートメントの2番目の用語がリテラル文字列として解釈されていた理由についてまだ興味があります。また、どの変数が最初であるか2番目であるかは関係ありません。


たぶんの戻り文字列の末尾に余分なスペースがあるgatttool(これでは$bulb1state)。
agold

引数はリテラル文字列として扱われます[ string1 = string2 ]-eqオペレータは、他の一方で、整数として扱います。何を期待していましたか?
ゴードンデイヴィソン

@GordonDavisson $ bulb1stateに含まれる値が「$ bulb1state」として評価されないため、string2が評価されることを期待しています。私のテキストエディタであるvimが「$ bulb1state」の色を変数の色ではなく文字列の色に変更するため、これが起こっていることを知っています。
RocketTwitch

回答:


0

私がコメントしたように、あなたはgatttool(すなわち$bulb1state)の出力に余分なスペースがあるかもしれません。比較する場合は=or ==(同等)を使用し、数値-eqについてはこの回答を参照してください。できる余分なスペースを無視するには(この回答を参照):

if [[ "$bulb1state" = "$offstate"* ]]; then
  #...
fi

私が言ったように、何らかの理由で私の2番目の変数はリテラル文字列のように扱われています。その正確なステートメントを使用すると、依然としてこの問題が発生します。回避策を見つけましたが、空白のコメントをありがとうございます。
RocketTwitch 16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.