Оператор 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

Я не понимаю, почему последние 2 эхо-выражения не отображаются.

Редактировать: На bulb1state был пробел. Этого достаточно, чтобы найти обходной путь, но мне все еще интересно, почему второй член оператора if интерпретировался как буквальная строка, когда я использовал оператор "=", а не оператор "-eq". Также не имело значения, какая переменная была первой или второй.

решение1

Как я уже прокомментировал, в выводе gatttool(ie $bulb1state) могут быть лишние пробелы. Для сравнения следует использовать =или ==(что эквивалентно), а для чисел -eqсм.этот ответ. Чтобы игнорировать лишние пробелы, вы можете сделать (см.этот ответ):

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

Связанный контент