从Bash脚本中的输入密码字符串中转义特殊字符

时间:2017-10-05 16:33:53

标签: bash shell

我有一个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变量。

1 个答案:

答案 0 :(得分:0)

如果完全可以避免,请不要将命令文本分配给字符串变量。使用函数存储代码或使用数组存储参数列表。 BashFAQ #50深入讨论了避免它的陷阱和最佳做法。

选项1:直接调用命令

以下命令可以正常使用:

RunSQL() {
      mysql --force --connect-timeout=90 --host="$db_host" -u root -p"$db_pass" "$@"
}

选项2:使用功能

请考虑以下事项:

RunSQL foo

执行此操作后,foo将在最后使用mysql_args=( --force --connect-timeout=90 --host="$db_host" -u root -p"$db_pass" ) mysql "${mysql_args[@]}" foo 调用您的命令。

选项3:使用数组

另一个选择是将参数存储在数组中:

printf -v mysql_cmd '%q ' mysql --force --connect-timeout=90 --host="$db_host" -u root -p"$db_pass"

选项4:让壳牌为你逃跑

有时,代码生成无法避免。在这种情况下,你应该要求shell进行繁重的工作。

eval "$mysql_cmd"

...存储一个可以用以下方法评估的值:

bash -c "$mysql_cmd"

或使用以下命令在新shell中运行:

<div class="navbar">
  ...links...
</div>
<div class="hero-with-image">
  <h1>Hello</h1>
</div>