我有一个Bash脚本来升级我的数据库架构。
我从终端读取了MySQL密码:
echo "Enter MySQL root password."
db_pass=
while [[ $db_pass = "" ]]; do
read -sp "Password: " db_pass
done
echo ""
MYSQL="mysql --force --connect-timeout=90 --host=$db_host -u root -p$db_pass"
但是,如果密码包含特殊字符,例如' *' asterix,然后我无法升级我的架构。我想要转义那些特殊的字符形式$db_pass
变量。
答案 0 :(得分:0)
如果完全可以避免,请不要将命令文本分配给字符串变量。使用函数存储代码或使用数组存储参数列表。 BashFAQ #50深入讨论了避免它的陷阱和最佳做法。
以下命令可以正常使用:
RunSQL() {
mysql --force --connect-timeout=90 --host="$db_host" -u root -p"$db_pass" "$@"
}
请考虑以下事项:
RunSQL foo
执行此操作后,foo
将在最后使用mysql_args=( --force --connect-timeout=90 --host="$db_host" -u root -p"$db_pass" )
mysql "${mysql_args[@]}" foo
调用您的命令。
另一个选择是将参数存储在数组中:
printf -v mysql_cmd '%q ' mysql --force --connect-timeout=90 --host="$db_host" -u root -p"$db_pass"
有时,代码生成无法避免。在这种情况下,你应该要求shell进行繁重的工作。
eval "$mysql_cmd"
...存储一个可以用以下方法评估的值:
bash -c "$mysql_cmd"
或使用以下命令在新shell中运行:
<div class="navbar">
...links...
</div>
<div class="hero-with-image">
<h1>Hello</h1>
</div>