首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash非交互式mysql数据库创建问题

Bash非交互式mysql数据库创建问题
EN

Unix & Linux用户
提问于 2021-11-17 21:45:26
回答 1查看 160关注 0票数 1

我有一个bash脚本,它利用对话框在非交互式Mysql数据库创建过程中显示进度条。

系统OS: Ubuntu 20.04服务器Mariadb: 10.5

The问题:只执行第一个Mysql命令(即创建数据库),如果是其他命令,则是Error 1064

代码语言:javascript
复制
#!/usr/bin/env bash
export NCURSES_NO_UTF8_ACS=1
var_db() {
    pfx=$(shuf -zer -n2 {a..z} | tr -d '\0')
    vnum=$(shuf -i 8-11 -n 1)
    sfx=$(openssl rand -base64 32 | tr -d /=+ | cut -c -"$vnum")
    varnam="${pfx}_${sfx}"
    echo "$varnam"
}
site_db() {
    dbname=$(var_db)
    userdb=$(var_db)
    vnum=$(shuf -i 12-15 -n 1)
    passdb=$(openssl rand -base64 32 | tr -d /=+ | cut -c -"$vnum")
    msgs=('Database created'
    'Database user created'
    'All privileges granted on database to user'
    'Reload privilege tables'
    'Restart Mariadb'
    'Reload Mariadb'
        )
    commands=('sudo mysql -e "CREATE DATABASE ${dbname};"'
    'sudo mysql -e "CREATE USER ${userdb}@localhost IDENTIFIED BY '${passdb}';"'
    'sudo mysql -e "GRANT ALL PRIVILEGES ON ${dbname}.* TO '${userdb}'@'localhost';"'
    'sudo mysql -e "FLUSH PRIVILEGES;"'
    'sudo systemctl restart mariadb'
    'sudo systemctl reload mariadb'
            )
    n=${#commands[@]}
    i=0
    while [ "$i" -le "$n" ]; do
        pct=$(( i * 100 / n )) # calculating progress percentage
        if [ $pct -eq 100 ]; then
            echo -e "XXX\n100\nMariadb secure installation completed!\nXXX"
        else
            echo -e "XXX\n$i\n${msgs[i]}\nXXX"
        fi
        echo "$pct"
        eval "${commands[i]}" > /dev/null 2>&1 #eval the output of the commands, 
        i=$((i + 1))
        sleep 2
    done | dialog --keep-tite --title "Site database configuration" --gauge "Site database created" 20 100 0
}
site_db

However,如果我不使用数组中的命令,那么所有的mysql命令都会在下面的脚本中执行。那么,为什么上面的脚本中有一个错误1064呢?

代码语言:javascript
复制
#!/usr/bin/env bash
var_db() {
    pfx=$(shuf -zer -n2 {a..z} | tr -d '\0')
    vnum=$(shuf -i 8-11 -n 1)
    sfx=$(openssl rand -base64 32 | tr -d /=+ | cut -c -"$vnum")
    varnam="${pfx}_${sfx}"
    echo "$varnam"
}
site_db() {
    dbname=$(var_db)
    userdb=$(var_db)
    vnum=$(shuf -i 12-15 -n 1)
    passdb=$(openssl rand -base64 32 | tr -d /=+ | cut -c -"$vnum")
    sudo mysql -e "CREATE DATABASE ${dbname};"
    sudo mysql -e "CREATE USER ${userdb}@localhost IDENTIFIED BY '${passdb}';"
    sudo mysql -e "GRANT ALL PRIVILEGES ON ${dbname}.* TO '${userdb}'@'localhost';"
    sudo mysql -e "FLUSH PRIVILEGES;"
    sudo systemctl restart mariadb
            )
}
site_db
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2021-11-17 23:18:15

这个问题与数组无关;它是引用。

代码语言:javascript
复制
userdb=userdb_value
passdb=passdb_value
set -x

eval echo 'sudo mysql -e "CREATE USER ${userdb}@localhost IDENTIFIED BY '${passdb}';"'
+ eval echo 'sudo mysql -e "CREATE USER ${userdb}@localhost IDENTIFIED BY passdb_value;"'
++ echo sudo mysql -e 'CREATE USER userdb_value@localhost IDENTIFIED BY passdb_value;'
sudo mysql -e CREATE USER userdb_value@localhost IDENTIFIED BY passdb_value;

echo sudo mysql -e "CREATE USER ${userdb}@localhost IDENTIFIED BY '${passdb}';"
+ echo sudo mysql -e 'CREATE USER userdb_value@localhost IDENTIFIED BY '\''passdb_value'\'';'
sudo mysql -e CREATE USER userdb_value@localhost IDENTIFIED BY 'passdb_value';

如果您可以使用"而不是'是SQL,那么您可以这样做:

代码语言:javascript
复制
'sudo mysql -e "CREATE USER ${userdb}@localhost IDENTIFIED BY \"${passdb}\";"'

如果没有的话,你可以这么做

代码语言:javascript
复制
'sudo mysql -e "CREATE USER ${userdb}@localhost IDENTIFIED BY '\''${passdb}'\'';"'

代码语言:javascript
复制
"sudo mysql -e \"CREATE USER ${userdb}@localhost IDENTIFIED BY '${passdb}';\""

代码语言:javascript
复制
quote=\'
'sudo mysql -e "CREATE USER ${userdb}@localhost IDENTIFIED BY ${quote}${passdb}${quote};"'
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/678011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档