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 文件中,那么您可能无法在自动化环境中执行此操作 你如何逃脱&amp; 还有一个反斜杠,这里是一个例子:# echo \&amp;&amp; 如果您有多个字符需要转义传递,效率会非常低 你以同样的方式转义^。我没有可以用 \ 转义的特殊字符列表,但可以在命令行凭经验推测和验证【参考方案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 - 使用特殊字符 ($) 导出环境变量的主要内容,如果未能解决你的问题,请参考以下文章

我可以将变量从 Bash 脚本导出到环境而不使用它吗?

如何在 bash 中使用带有特殊字符的变量? [复制]

Bash 脚本从 setup.py 或 PKG-INFO 文件中获取版本并导出为环境变量

linux 的bash变量

bash简介1

解决 MAC 终端上每次打开新窗口手动执行source ~/.bash_profile导出环境变量