我的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脚本上调用。
如何以捕获的格式转义"
,'
和`字符?
答案 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");一般来说,最好将数据作为文字数据传递,而不是生成代码。