Bash - оператор If, выполняющий пустое сравнение - PullRequest
1 голос
/ 04 августа 2020

Я знаю, это звучит глупо, но на этой неделе у меня было грубое начало, и я не могу ясно мыслить.

Я пишу этот простой фрагмент кода, который, как предполагается, будет немного сложным позже. Однако я застрял возле этого простого оператора условия If.

Я написал код в VS на моем хосте Ubuntu, скопировал его в файл внутри контейнера docker и выполнил его.

Как видите, левая часть условия IF принимается как нулевое значение для сравнения. Где я ошибаюсь?

#!/bin/bash

someEquation()
{
    cluster_state=`src/redis-cli -h 127.0.0.1 -p 36000 cluster info | grep cluster_state | awk -F':' '{print$2}'`
    if [[ " ${cluster_state} " == "fail" ]]; then
        echo "arr contains fail"
    fi
}

someEquation

Вывод:

+ someEquation
++ src/redis-cli -h 127.0.0.1 -p 36000 cluster info
++ grep cluster_state
++ awk -F: '{print$2}'
+ cluster_state=$'fail\r'
  == \f\a\i\l ]]

Ответы [ 2 ]

3 голосов
/ 04 августа 2020

Если переменная cluster_state всегда имеет завершающий возврат каретки (шестнадцатеричный: 0d), удалите последний символ из переменной перед сравнением:

[[ "${cluster_state%?}" == "fail" ]]

или добавьте возврат каретки в обратная сторона:

[[ "${cluster_state}" == "fail"$'\r' ]]
3 голосов
/ 04 августа 2020

Видя здесь попытку OP редактирования / улучшения кода OP.

  • Я прикрепил сюда logi c удаления управляющих символов m с вашим logi c.
  • Также когда мы используем awk, нам не нужно использовать с ним grep, поэтому я тоже удалил его в качестве улучшения. Но честное предупреждение не проверялось, оно должно работать, но.
  • согласно комментариям сэра Бармара удалили пробелы из переменной, иначе это даст неправильные результаты. значение переменной.
someEquation()
{
    cluster_state=$(src/redis-cli -h 127.0.0.1 -p 36000 cluster info | awk -F':' '/cluster_state/{gsub(/\r/,"",$2);print $2}')
    if [[ "${cluster_state}" == "fail" ]]; then
        echo "arr contains fail"
    fi
}

someEquation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...