Bash - 使用特殊字符 ($) 导出环境变量
Posted
技术标签:
【中文标题】Bash - 使用特殊字符 ($) 导出环境变量【英文标题】:Bash - export environment variables with special characters ($) 【发布时间】:2017-09-15 16:19:00 【问题描述】:我正在解析一个带有key=value
数据的文件,然后将它们导出为环境变量。我的解决方案有效,但不适用于特殊字符,例如:
.数据
VAR1=abc
VAR2=d#r3_Pos-!kblg1$we3d4xhshq7=mf$@6@3l^
脚本.sh
#!/bin/bash
while IFS="=" read -r key value; do
case "$key" in
'#'*) ;;
*)
eval "$key=\"$value\""
export $key
esac
done < .data
$ . ./script.sh
输出:
$ echo $VAR1
abc
$ echo $VAR2
d#r3_Pos-!kblg1=mf6@3l^
但应该是:d#r3_Pos-!kblg1$we3d4xhshq7=mf$@6@3l^
【问题讨论】:
试试单引号?这似乎对我有用。 【参考方案1】:只需用反斜杠转义 $ 符号 \
【讨论】:
如果数据是由某个 3rd-party 应用程序自动生成并保存在.data
文件中,那么您可能无法在自动化环境中执行此操作
你如何逃脱&
?
还有一个反斜杠,这里是一个例子:# echo \&
&
如果您有多个字符需要转义传递,效率会非常低
你以同样的方式转义^。我没有可以用 \ 转义的特殊字符列表,但可以在命令行凭经验推测和验证【参考方案2】:
只需使用单引号:
export VAR2='d#r3_Pos-!kblg1$we3d4xhshq7=mf$@6@3l^'
【讨论】:
如果字符串包含 ,则 VAR2 将变为数组,整个字符串将用 , 分割,【参考方案3】:您根本不需要 eval,只需使用 bash
中的内置 declare
即时创建变量!
case "$key" in
'#'*) ;;
*)
declare $key=$value
export "$key"
esac
【讨论】:
【参考方案4】:如果您无法更改 .data 文件,则在将值分配给键时必须转义特殊字符 $
。将赋值行更改为:
eval "$key=\"$value//\$/\\\$\""
$variable//A/B
表示将variable
中的每个A
实例替换为B
。
更多关于 bash 变量的有用信息here
【讨论】:
【参考方案5】:我发现以下脚本(有来源)很有帮助:
set -a
source <(cat development.env | \
sed -e '/^#/d;/^\s*$/d' -e "s/'/'\\\''/g" -e "s/=\(.*\)/='\1'/g")
set +a
发件人:https://***.com/a/66118031/339144
【讨论】:
以上是关于Bash - 使用特殊字符 ($) 导出环境变量的主要内容,如果未能解决你的问题,请参考以下文章