【问题标题】:How to run MySQL command on bash?如何在 bash 上运行 MySQL 命令?
【发布时间】:2013-11-30 18:26:53
【问题描述】:
以下代码在命令行上运行
mysql --user='myusername' --password='mypassword' --database='mydatabase' --execute='DROP DATABASE myusername;
CREATE DATABASE mydatabase;'
但是,它在执行时对 bash 文件不起作用
#!/bin/bash
user=myusername
password=mypassword
database=mydatabase
mysql --user='$user' --password='$password' --database='$database' --execute='DROP DATABASE $user; CREATE DATABASE $database;'
我收到以下错误:
错误 1045 (28000): 用户 '$user'@'localhost' 的访问被拒绝(使用密码:YES)
如何让bash文件作为命令行运行?
【问题讨论】:
标签:
mysql
bash
unix
terminal
special-characters
【解决方案1】:
我编写了一个 shell 脚本,它将从属性文件中读取数据,然后在 shell 脚本上运行 mysql 脚本。分享这可能对其他人有所帮助。
#!/bin/bash
PROPERTY_FILE=filename.properties
function getProperty {
PROP_KEY=$1
PROP_VALUE=`cat $PROPERTY_FILE | grep "$PROP_KEY" | cut -d'=' -f2`
echo $PROP_VALUE
}
echo "# Reading property from $PROPERTY_FILE"
DB_USER=$(getProperty "db.username")
DB_PASS=$(getProperty "db.password")
ROOT_LOC=$(getProperty "root.location")
echo $DB_USER
echo $DB_PASS
echo $ROOT_LOC
echo "Writing on DB ... "
mysql -u$DB_USER -p$DB_PASS dbname<<EOFMYSQL
update tablename set tablename.value_ = "$ROOT_LOC" where tablename.name_="Root directory location";
EOFMYSQL
echo "Writing root location($ROOT_LOC) is done ... "
counter=`mysql -u${DB_USER} -p${DB_PASS} dbname -e "select count(*) from tablename where tablename.name_='Root directory location' and tablename.value_ = '$ROOT_LOC';" | grep -v "count"`;
if [ "$counter" = "1" ]
then
echo "ROOT location updated"
fi
【解决方案2】:
当 $user 和 $password 在单引号之外时,这个有效,双引号。在单引号语句中使用单引号。
mysql --user="$user" --password="$password" --database="$user" --execute='DROP DATABASE '$user'; CREATE DATABASE '$user';'
【解决方案3】:
在使用 BASH 变量时使用双引号。
mysql --user="$user" --password="$password" --database="$database" --execute="DROP DATABASE $user; CREATE DATABASE $database;"
BASH 不会用单引号扩展变量。