繁体   English   中英

如何在Bash中的Heredoc之后使用控件运算符

[英]How to use control operator after a heredoc in bash

我正在编写一个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"

我希望数据库创建成功完成,然后运行print命令。 但是我不能将&&放在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 &&"

我该怎么做?

一个简单的解决方法是,如果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"

解析很奇怪,但是可以习惯了。 |之后的换行符(和评论) && || 被忽略。 因此,您只需在命令的末尾写上,但是在<< 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的示例。

将sudo放入圆括号中:

#!/bin/bash
(sudo mysql -u root << EOF
   ...
EOF
) && [next command]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM