Bash - 使用特殊字符($)导出环境变量

30
我正在解析一个包含key=value数据的文件,并将它们导出为环境变量。我的解决方案有效,但是对于特殊字符却无法正常工作,例如:

.data

VAR1=abc
VAR2=d#r3_P{os-!kblg1$we3d4xhshq7=mf$@6@3l^

script.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_P{os-!kblg1=mf6@3l^

但应该是:d#r3_P {os-!kblg1$we3d4xhshq7=mf$ @6@3l ^


9
尝试使用单引号?这种方法对我来说似乎有效。 - Ben Creasy
5个回答

52

只需使用单引号:

export VAR2='d#r3_P{os-!kblg1$we3d4xhshq7=mf$@6@3l^'

3
如果字符串包含逗号,则VAR2将成为数组,并且整个字符串将被逗号分隔。 - ImranRazaKhan

18

只需要用反斜杠 \ 转义 $ 符号即可。


3
如果数据是由某些第三方应用程序自动生成并保存在“.data”文件中,则您可能无法在自动化环境中完成此操作。 - Rogus
1
你如何转义 & 符号? - nurettin
1
也可以使用反斜杠来转义字符,以下是一个例子:# echo \& & - Yedidia
1
如果您需要传递多个需要转义的字符,则非常低效。 - Mitch
你可以以同样的方式转义^。我没有特殊字符列表,可以用\进行转义,但可以通过经验推测并在命令行上验证。 - David

3

3
你根本不需要使用eval,只需在bash中使用内置的declare即可动态创建变量!
case "$key" in
  '#'*) ;;
   *)
       declare $key=$value
       export "$key"
esac

2
如果你无法更改 .data 文件,那么在为键分配值时必须转义特殊字符 $。将赋值行更改为:
eval "$key=\"${value//\$/\\\$}\""

${variable//A/B}的意思是在variable中替换每个实例的AB

关于bash变量的更多有用信息,请点击这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接