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

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

なぜそうなるのかはわかりません。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 番目であるかは問題ではありませんでした。

答え1

私がコメントしたように、出力に余分なスペースがある可能性がありますgatttool(つまり$bulb1state)。比較には=または==(どちらも同等)を使用する必要があります。数値 については-eq、を参照してください。この答え余分なスペースを無視するには、次のようにします(この答え):

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

関連情報