Как использовать оператор управления после heredoc в Bash - PullRequest
2 голосов
/ 31 мая 2019

Я пишу bash-скрипт для автоматического создания базы данных MySQL. Сценарий bash похож на следующий (пожалуйста, игнорируйте эти переменные $ db_name, $ db_pwd ...):

#!/bin/bash
sudo mysql -u root << EOF
    CREATE DATABASE $db_name;
    CREATE USER $db_user IDENTIFIED BY $db_pwd;
    GRANT ALL PRIVILEGES ON $db_name.* TO $db_user;
    quit
EOF
printf "Done"

Я хочу, чтобы создание базы данных было успешно завершено, а команда печати запущена позже. Но я не могу поставить && после EOF, например:

#!/bin/bash
sudo mysql -u root << EOF
    CREATE DATABASE $db_name;
    CREATE USER $db_user IDENTIFIED BY $db_pwd;
    GRANT ALL PRIVILEGES ON $db_name.* TO $db_user;
    quit
EOF &&
printf "Done"

Это покажет ошибку как:

invalid command name "EOF"
    while executing
"EOF &&"

Как я могу это сделать?

Ответы [ 3 ]

4 голосов
/ 31 мая 2019

Простой обходной путь - выйти, если mysql не работает.

sudo mysql -u root << EOF || exit
    CREATE DATABASE $db_name;
    CREATE USER $db_user IDENTIFIED BY $db_pwd;
    GRANT ALL PRIVILEGES ON $db_name.* TO $db_user;
EOF
echo "Done"

Или вы можете добавить set -e, чтобы любая неудачная команда немедленно вышла из сценария.

#!/bin/bash
set -e

sudo mysql -u root << EOF
    CREATE DATABASE $db_name;
    CREATE USER $db_user IDENTIFIED BY $db_pwd;
    GRANT ALL PRIVILEGES ON $db_name.* TO $db_user;
EOF
echo "Done"
1 голос
/ 31 мая 2019

Разбор странный, но к нему можно привыкнуть.Новые строки (и комментарии) после | && || игнорируются.Таким образом, вы просто пишете в конце строки с командой, но после << EOF

#!/bin/bash
sudo mysql -u root << EOF &&
    CREATE DATABASE $db_name;
    CREATE USER $db_user IDENTIFIED BY $db_pwd;
    GRANT ALL PRIVILEGES ON $db_name.* TO $db_user;
    quit
EOF
printf "Done"

Пример:

grep -q bla << EOF &&
bla bla
EOF
# this comment is ignored

# lines with spaces, tabs and newlines and comments only are ignored
# until the first line with something is encountered
# the following will execute only if grep returns zero status
# it can be misleading

# Because you can write a LOT here, but bash stil just sees `grep && printf`
printf "grep matched successfully"

Пример на tutorialspoint .

0 голосов
/ 31 мая 2019

заключить sudo в круглые скобки:

#!/bin/bash
(sudo mysql -u root << EOF
   ...
EOF
) && [next command]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...