【问题标题】:Bash - export environment variables with special characters ($)Bash - 使用特殊字符 ($) 导出环境变量
【发布时间】:2017-09-15 16:19:00
【问题描述】:

我正在解析一个带有key=value 数据的文件,然后将它们导出为环境变量。我的解决方案有效,但不适用于特殊字符,例如:

.数据

VAR1=abc
VAR2=d#r3_P{os-!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_P{os-!kblg1=mf6@3l^

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

【问题讨论】:

  • 试试单引号?这似乎对我有用。

标签: bash


【解决方案1】:

只需用反斜杠转义 $ 符号 \

【讨论】:

  • 如果数据是由某个 3rd-party 应用程序自动生成并保存在 .data 文件中,那么您可能无法在自动化环境中执行此操作
  • 你如何逃脱&amp;
  • 还有一个反斜杠,这里是一个例子:# echo \&amp;&amp;
  • 如果您有多个字符需要转义传递,效率会非常低
  • 你以同样的方式转义^。我没有可以用 \ 转义的特殊字符列表,但可以在命令行凭经验推测和验证
【解决方案2】:

只需使用单引号:

export VAR2='d#r3_P{os-!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://stackoverflow.com/a/66118031/339144

      【讨论】:

        猜你喜欢
        • 2021-09-23
        • 1970-01-01
        • 2015-11-14
        • 1970-01-01
        • 1970-01-01
        • 2019-05-11
        • 1970-01-01
        • 2021-10-03
        • 2013-03-08
        相关资源
        最近更新 更多