Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux shell scipt中捕获组中的转义引号_Linux_Bash_Shell - Fatal编程技术网

Linux shell scipt中捕获组中的转义引号

Linux shell scipt中捕获组中的转义引号,linux,bash,shell,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\u GENPASS输出也将在docker compose脚本上调用 我如何

我的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\u GENPASS
输出也将在docker compose脚本上调用


我如何逃脱
和`捕获格式的字符

我假设您在这里要做的是生成一个字符串,该字符串可以作为shell命令进行计算
printf%q
是ksh中的一个扩展,由bash和其他人采用,它执行使字符串
eval
安全所需的任何和所有转义:

printf -v mysql_genpass 'MY_SQL_ROOT_PASSWORD=%q' "$(openssl rand -base64 37 | head -c 37)"
…将把一个命令放入
$mysql\u genpass
中,当使用
eval“$mysql\u genpass”
或同等工具执行该命令时,将设置
MY\u SQL\u ROOT\u密码

printf-v var…
var=$(printf…
更有效地将计算格式字符串的结果分配给变量,因为后者需要分叉子shell)



也就是说,除非您有令人信服的理由这样做,否则最好避免将shell片段分配给标量变量。见,和;一般来说,最好将数据作为文字数据传递,而不是生成代码。

我假设您在这里要做的是生成一个字符串,该字符串可以作为shell命令进行计算
printf%q
是ksh中的一个扩展,由bash和其他人采用,它执行使字符串
eval
安全所需的任何和所有转义:

printf -v mysql_genpass 'MY_SQL_ROOT_PASSWORD=%q' "$(openssl rand -base64 37 | head -c 37)"
…将把一个命令放入
$mysql\u genpass
中,当使用
eval“$mysql\u genpass”
或同等工具执行该命令时,将设置
MY\u SQL\u ROOT\u密码

printf-v var…
var=$(printf…
更有效地将计算格式字符串的结果分配给变量,因为后者需要分叉子shell)



也就是说,除非您有令人信服的理由这样做,否则最好避免将shell片段分配给标量变量。见,和;一般来说,最好将数据作为文字数据传递,而不是生成代码。

请参见POSIX规范中的
echo
——如果仔细阅读,您会发现任何在输出上执行任何操作(而不是打印
-e
)的实现都是不符合要求的。此外,使用
echo-e
[在一个通过实现反斜杠转义序列而违反标准的shell上]意味着密码中的这些序列将由
echo
本身解释。如果使用
printf
,并将变量从格式字符串带外传递,则不会出现此问题……也就是说:
printf'\n您的mysql密码ENV变量可以通过以下代码设置:%s\n'$mysql\u GENPASS“
——与
echo-e
不同,它只接受格式字符串本身内部的转义序列。此外,我不确定我会称之为“GENPASS”——我的意思是,它在被调用时只提前生成一个密码,而不是每次生成一个新密码;如果您想要后者,您就需要编写一个函数(好吧——我绝对不会称之为GENPASS all caps,因为这不符合POSIX定义的约定;请参阅第四段——搜索“预留给应用程序”——记住环境变量和shell变量共享一个名称空间)。请参阅POSIX规范中的
echo
——如果仔细阅读,您会发现任何在其输出上给出
echo-e
而不是打印
-e
时执行任何操作的实现都是不符合规范的。此外,使用
echo-e
[在一个通过实现反斜杠转义序列而违反标准的shell上]意味着密码中的这些序列将由
echo
本身解释。如果使用
printf
,并将变量从格式字符串带外传递,则不会出现此问题……也就是说:
printf'\n您的mysql密码ENV变量可以通过以下代码设置:%s\n'$mysql\u GENPASS“
——与
echo-e
不同,它只接受格式字符串本身内部的转义序列。此外,我不确定我会称之为“GENPASS”——我的意思是,它在被调用时只提前生成一个密码,而不是每次生成一个新密码;如果您想要后者,您就需要编写一个函数(好吧——我绝对不会称之为GENPASS all caps,因为这不符合POSIX定义的约定;请参阅第四段——搜索“预留给应用程序”——记住环境变量和shell变量共享一个名称空间)。