bash if 语句不断将第二个参数更改为文字字符串

bash if 语句不断将第二个参数更改为文字字符串

所以我不确定它为什么会这样做。我的 if 语句一直将第二个变量解释为文字字符串而不是变量。下面是我的确切代码。

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

我不明白为什么最后两个回显语句没有显示。

编辑:bulb1state 上有一个空白。这足以让我找到解决方法,但我仍然很好奇,当我使用“=”运算符而不是“-eq”运算符时,为什么 if 语句的第二项被解释为文字字符串。哪个变量是第一个或第二个也不重要。

答案1

就像我评论的那样,输出gatttool(即$bulb1state)中可能有多余的空格。对于比较,您应该使用===(它们是等效的),对于数字-eq,请参见这个答案。要忽略多余的空格,您可以执行以下操作(请参阅这个答案):

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

相关内容