2

Мне нужно запустить хранимую процедуру, используя MySQL из Bash. Хранимая процедура возвращает переменную, и мне нужно проверить значение переменной в bash, чтобы отобразить ее соответствующим образом. Если я выводю переменную напрямую, она отображает значение правильно, но если я проверяю значение, используя if , условие if никогда не выполняется, и я не получаю «YES», отображаемое в следующем случае.

Чтобы упростить задачу, я упростил bash-файл следующим образом:

result=$(mysql -h localhost -u$MYSQL_USER -p$MYSQL_PASSWORD -s -e "set @myVarible = 'YES';select @myVarible" $MYSQL_DATABASE)

if [[ $result == 'YES' ]] ; then
    echo YES
fi

Вывод echo -n "$result" | od -ctx1 - это

0000000   Y   E   S  \r
         59  45  53  0d
0000004

1 ответ1

0

Ваш вывод из echo -n "$result" | od -ctx1 показывает, что ваша переменная result получает возврат каретки, застрявший в конце.  (Это показано как \r и 0d в od -ctx1 .)  Что касается кого-либо, то это просто еще один символ, и он не соответствует YES больше, чем YESK или YESS .  Возможно, лучшим решением вашей проблемы является изменение команды mysql чтобы она не выводила возврат каретки.  Но я не знаю, как это сделать, и я знаю, как исправить результат после того, как вы поместили его в оболочку.

После вашей команды mysql произнесите

result="${result%$'\r'}"

Конструкция

${ variable_name % string }

(где пробелы добавлены для ясности) расширяется до значения переменной со строкой, удаленной с конца.  Например, если $vehicle является carriage , то ${vehicle%riage} является car .

$' string '

аналогично 'string' (строка в кавычках), за исключением того, что строка может содержать escape-последовательности, такие как \t для Tab и \r для возврата каретки.  Итак, ${result%$'\r'} - это значение $result с возвращением каретки, удаленным с конца.  Теперь вы сможете проверить его с помощью кода, подобного [[ $result == 'YES' ]] .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .