如何将Bash密码变量Base64编码脚本适配为POSIX sh兼容版本?
兼容POSIX sh的密码环境变量Base64编码脚本方案
有一段仅能在Bash中运行的脚本,它可以将所有名称以_PASSWORD结尾的环境变量,生成对应的Base64编码副本环境变量(命名规则为原变量名加_B64后缀)。原脚本如下:
while read -r line; do CMD="${line}_B64=$(echo -n "${!line}" | base64)"; export "$CMD"; done <<< $(env | grep -E "PASSWORD=" | sed 's/=.*//g')
但这段脚本无法在POSIX标准的sh环境中运行,核心问题有两个:
- 使用了Bash独有的间接参数扩展语法
${!line},该语法不属于POSIX标准; - 使用了Bash特有的here字符串
<<<,若改用常规管道写法,循环会在子shell中执行,导致生成的环境变量无法在父shell中生效。
兼容POSIX sh的解决方案
以下是适配POSIX标准sh的脚本,解决了上述两个问题:
# 遍历所有以_PASSWORD结尾的环境变量,生成Base64编码副本 for var in $(env | grep -E '_PASSWORD=' | sed 's/=.*//'); do # 通过eval获取原变量的值,替代Bash的${!var} eval "var_value=\$$var" # 生成Base64编码并导出新的环境变量 eval "export ${var}_B64=\$(echo -n \"\$var_value\" | base64)" done
关键修改说明
- 用
for循环替代while read配合here字符串的写法,避免循环进入子shell,确保生成的环境变量在当前shell生效; - 使用
eval "var_value=\$$var"实现间接变量取值,这是POSIX sh中获取动态变量值的标准方式; - 同样通过
eval完成环境变量的导出操作,保证新变量能被正确设置并导出。
执行示例
$ env TEST1_PASSWORD=Hello TEST2_PASSWORD=World $ # 运行上述兼容脚本 $ env TEST1_PASSWORD=Hello TEST2_PASSWORD=World TEST1_PASSWORD_B64=SGVsbG8= TEST2_PASSWORD_B64=V29ybGQ=
内容的提问来源于stack exchange,提问作者user179157
相关产品推荐
相关产品推荐

