Проверка значения в базе данных MySQL из сценария Linux Bash
Вы можете заставить свои bash-скрипты работать по-разному в зависимости от содержимого базы данных MySQL, подключившись к ней из командной строки и передав запрос, который вы можете использовать в блоках if
для ветвления на основе значения.
Примечание. В наших примерах показано использование пользователя root в MySQL, но вы хотели бы заменить там другую учетную запись пользователя.
Запуск SQL-запросов из сценария Bash
Синтаксис запуска внутри скрипта bash такой же, как и при доступе к базе данных из командной строки:
mysql -u root -pPassword -h hostname -D dbname -e 'query'
Если ваша база данных работает локально, флаг -h
можно не указывать. Если вы используете базу данных разработки, вы можете опустить флаг -p
, если у вашей базы данных нет пароля.
Это выведет результаты запроса в STDOUT, которые вы можете передать в файл:
mysql -u root -D dbname -e 'SELECT * FROM table' > file
…или сохранить в переменной с конструкцией $ ( )
:
variable=$(mysql -u root -D dbname -e 'SELECT * FROM table')
Но по умолчанию вывод будет не очень красивым, поэтому вы можете упростить работу с ним, используя флаг -B
для печати в формате значений, разделенных табуляцией (TSV), и -N
флаг, чтобы пропустить заголовки столбцов.
Файлы TSV являются менее используемыми родственниками файлов CSV, которые вы можете преобразовать из командной строки.
Проверка конкретного значения и ветвление
Если вы хотите выполнить ветвление на основе значения в вашей базе данных, вы можете запросить конкретную строку и столбец и сохранить ответ в переменной. Затем вы можете использовать блок bash if
для ветвления на основе содержимого этой переменной.
field=$(mysql -u root -BNe 'USE test; SELECT label FROM test WHERE id=1') if [ $field == 'TEST' ]; then //do stuff fi
Это работает только тогда, когда вы запрашиваете конкретное значение и выполняете простое сравнение. Если вам нужно больше манипуляций, чем предоставляет bash, вы можете использовать awk
, который может выделять отдельные столбцы из текста и выполнять сравнения:
if [ $(echo $field | awk '{if ($1 == value && $2 == value2) print 1; else print 0}') == "1" ]; then //do stuff fi
Здесь команда awk
выводит true или false (1 или 0), которые bash if
может использовать для сравнения и ветвления.
В обоих этих примерах предполагается, что ваш SQL-запрос возвращает только одну строку, в чем вы можете убедиться, выбрав на основе идентификатора. Но если вы выполняете более сложный запрос, вы можете ограничить ответ первой строкой с помощью команды SQL LIMIT 1
.
Проверка ошибок: проверьте, существует ли база данных или таблица
Хотя вы, вероятно, пишете этот скрипт специально для своего сервера, небольшая проверка ошибок никому не повредит. Вы захотите убедиться, что база данных и таблицы, с которыми вы будете работать, действительно существуют, прежде чем вы начнете с ними возиться. Кроме того, если соединение с базой данных не работает, здесь также будет ошибка.
Команда SQL USE dbname
выдаст ошибку, если dbname
не существует (код возврата > 0). Вы можете использовать это в блоке if
, чтобы проверить, правильно ли настроена база данных:
if mysql -u root -e 'USE mydbname'; then //database exists, do stuff fi
Вы можете инвертировать блок if
, начав логическое значение с !
, что запустит код, только если база данных не настроена, что полезно при первой настройке. .
Точно так же вы можете проверить, существуют ли таблицы, попытавшись получить доступ к первой строке:
if mysql -u root -e 'USE mydbname; SELECT * FROM tablename LIMIT 1'; then //database and table exist, do more stuff fi
Поскольку блок if
проверяет код возврата любой введенной вами команды, а команды MySQL будут возвращать код ошибки в случае возникновения проблем, вы можете использовать любую команду в блоке if
block для учета ошибок.