результат оператора как ошибка сравнения строк в Linux - PullRequest
1 голос
/ 07 августа 2020

Я написал фрагмент кода, чтобы проверить, занята ли цель, и вот код:

board_status=$(ssh -o ConnectTimeout=2 root@10.31.35.84 -t "cat /userdata/status" )
echo board_status: $board_status 

if [[ $board_status == "BUSY" ]]; then
    echo board is busy
    EVAL_BOARD_IP=0
else
    echo board is not busy
    EVAL_BOARD_IP=10.31.35.84
fi
echo EVAL_BOARD_IP: ${EVAL_BOARD_IP}

Я обнаружил, что это не работает, и напечатанный результат:

$ sh test.sh
Connection to 10.31.35.84 closed.
board_status: BUSY
board is not busy
EVAL_BOARD_IP: 10.31.35.84

Я не могу понять, почему оператор if будет go в ветке else

1 Ответ

1 голос
/ 07 августа 2020

Замените

if [[ $board_status == "BUSY" ]]; then

на

if [[ $board_status =~ "BUSY" ]]; then

Первая команда проверяет, соответствует ли $board_status BUSY. Последний проверяет, содержит ли $board_status просто символы BUSY

Что пошло не так.

Предположим, что файл /userdata/status имеет окончания строки DOS / Windows, что означает, что board_status будет иметь последний символ возврата каретки, \r, например:

 board_status=$'BUSY\r'

С этим значением обратите внимание, как выглядит результат declare -p:

$ declare -p board_status
"eclare -- board_status="BUSY

Это потому, что возврат каретки после Y заставляет терминал начать запись с начала строки, перезаписывая d тем, что должно было быть последним символом в строке, ".

If board_status на самом деле было BUSY, вот как должна выглядеть команда declare -p:

$ board_status=$'BUSY'
$ declare -p board_status
declare -- board_status="BUSY"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...