在shell scipt内的捕获组中转义引号

时间:2016-01-13 18:22:31

标签: linux bash shell

我的shell脚本中有这一行:

MYSQL_GENPASS=($echo -e MYSQL_ROOT_PASSWORD=`openssl rand -base64 37 | sed -e 's/^\(.\{37\}\).*/\1/g'`)

稍后我用以下方式调用此行的输出:

echo -e "\nYour MySQL password ENV variable is: " $MYSQL_GENPASS

$MYSQL_GENPASS输出也将在docker-compose脚本上调用。

如何以捕获的格式转义"'和`字符?

1 个答案:

答案 0 :(得分:4)

我假设你在这里尝试做的是生成一个可以作为shell命令进行评估的字符串。 printf %q是ksh中的扩展 - 由bash和其他人采用 - 它可以执行任何必要的转义以创建字符串eval - 安全:

printf -v mysql_genpass 'MY_SQL_ROOT_PASSWORD=%q' "$(openssl rand -base64 37 | head -c 37)"

...会将命令放入$mysql_genpass,当使用eval "$mysql_genpass"或同等身份执行时,会设置MY_SQL_ROOT_PASSWORD

printf -v var ...将格式字符串的结果分配给变量的效率高于var=$(printf ...),因为后者需要分支子shell。)

尽管如此,除非你有令人信服的理由这样做,否则最好避免将shell片段分配给标量变量。见BashFAQ #50 ("I'm trying to put a command in a variable, but complex cases always fail!")BashFAQ #48 ("Eval command and security issues");一般来说,最好将数据作为文字数据传递,而不是生成代码。