Я пытаюсь написать сценарий, который будет обслуживать наш сервер Ubuntu для тех, кто еще меньше разбирается в Linux, чем я.
Когда я запускаю сценарий от имени администратора (необходим для доступа к mysql), он запрашивает у меня правильный пароль, команда mysql запускается успешно, но следующие команды не запускаются. Терминал просто сидит и не продолжает работу и не дает сбоя.
Любая идея, что я делаю неправильно, будет очень кстати. Я провел небольшое исследование, но никаких решений для Google не появилось.
#! /bin/sh
mysql -p fog
DELETE FROM `hosts` WHERE `hostID` = '0';
#more DELETE commands in here, removed for brevity
DELETE FROM tasks WHERE taskTypeId=8;
$Shell
Команда mysql
ожидает чтения команд со стандартного ввода. Вы можете обеспечить это в сценарии, используя here document:
#! /bin/sh
mysql -p fog <<'EOF'
DELETE FROM 'hosts' WHERE 'hostID' = '0';
#more DELETE commands in here, removed for brevity
DELETE FROM tasks WHERE taskTypeId=8;
EOF
Управление вернется в оболочку после выхода команды mysql
. Цитирование первого 'EOF'
(или также \EOF
или "EOF"
) не позволяет оболочке расширить содержимое - это не проблема для команд в вашем примере, но что-то вроде SELECT * FROM
иначе расширит *
до списка файлов. Фактическая строка EOF
является произвольной.
Другая возможность - создать 2 файла: один для ваш сценарий bash (скажем mybash
, другой для команд SQL ( mydeletes.sql
):
mybash
#! /bin/sh
mysql -p fog <<mydeletes.sql
mydeletes.sql
DELETE FROM 'hosts' WHERE 'hostID' = '0';
#more DELETE commands in here, removed for brevity
DELETE FROM tasks WHERE taskTypeId=8;
Это разделит код SQL из кода bash. Это позволит вам загружать, выполнять и отлаживать ваш SQL-скрипт во многих (если не во всех) инструментах SQL (DBeaver, Workbench, ...)