带有反引号的bash转义感叹号内部变量

时间:2017-03-06 15:01:37

标签: linux bash

我有这个bash脚本:

databases=`mysql -h$DBHOST -u$DBUSER -p$DBPASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database`

问题是密码包含所有可能的字符。在这种情况下,我怎样才能逃脱$DBPASSWORD?如果我的密码是'!'并且鉴于命令在反引号中。我没有使用bash脚本的经验,但我已尝试使用"$DBPASSWORD"'$DBPASSWORD',但它无法正常工作。谢谢

LATER EDIT:链接到脚本,第170行 - > https://github.com/Ardakilic/backmeup/blob/master/backmeup.sh

2 个答案:

答案 0 :(得分:3)

首先:answer from @bishop点亮:不要在命令行上传递密码。

第二:对所有shell扩展使用双引号。 所有这些。总是

{{1}}

答案 1 :(得分:2)

不要在命令行上传递MySQL密码。一,使用包含shell元字符的密码(如您所发现的)可能会很棘手。第二,使用ps的人可以嗅探密码。

而是将密码放入系统my.cnf,用户配置文件(例如.mylogin.cnf)或创建按需文件以保存密码:

function mysql() {
    local tmpfile=$(mktemp)
    cat > "$tmpfile" <<EOCNF
[client]
password=$DBPASSWORD
EOCNF
    mysql --defaults-extra-file="$tmpfile" -u"$DBUSER" -h"$DBHOST" "$@"
    rm "$tmpfile"
}

然后你可以运行它:

mysql -e "SHOW DATABASES" | tr -d "| " ....
mysql -e "SELECT * FROM table" | grep -v ...

有关更多示例,请参阅MySQL docs on configuration files