【问题标题】:Set an environment variable defined by a string?设置由字符串定义的环境变量?
【发布时间】:2020-04-21 15:31:41
【问题描述】:

我正在编写一个脚本来将配置变量从云存储服务复制到环境变量中(仅用于本地开发,以避免在应用程序或测试服务器启动时发出一大堆请求)。我已经有一个文件,它是以行分隔的变量名列表。

我知道如何使用已知名称设置环境变量:

export SOME_VAR=some_value

我不知道如何使用“未知”(在写入时)名称设置环境变量。所以我会读入那个变量名的文件,然后遍历列表,请求每个变量和exporting

所以主要的问题是:如何在运行时以编程方式设置名称仅存在于字符串中的环境变量?

【问题讨论】:

    标签: bash shell environment-variables


    【解决方案1】:

    您的脚本实际上不应该与 cat|while 一起使用,因为在这种情况下,while 将在子进程中执行,并且任何设置或导出都只会影响子进程。循环结束后,所有变量都将丢失。

    试试这个:

    #! /usr/bin/env bash
    while IFS= read -r line; do
      export $(echo ${line^^})=$(get_value_from_secret_store "$line")
    done < list_of_vars_file.txt
    

    【讨论】:

    • 我很困惑。根据您的回答,我的脚本根本不应该工作,但确实可以。也许是因为我source它而不是直接运行它?
    • 类似“cmd | cmd”的构造实际上在子进程中运行第二个命令...
    • 很奇怪。那它为什么起作用?听起来不应该,但确实如此。
    • 能否分享以 $ cat .... $ ./myscript .... $ echo $variable 开头的控制台日志?
    【解决方案2】:

    我想通了!

    如果你在$value 中有你想要的值,并且你想在$name 中设置环境变量的名称,你可以这样做:

    export "$name"="$value"
    

    额外提示:

    我还需要大写变量名,可以这样做:

    up_name="$(echo "$name" | tr '[:lower:]' '[:upper:]'"
    

    所以我的最终脚本最终是:

    #! /usr/bin/env bash
    
    cat < list_of_vars_file.txt | while IFS= read -r line; do
      value="$(get_value_from_secret_store "$line")"
      up_name="$(echo "$line" | tr '[:lower:]' '[:upper:]')"
    
      export "$up_name"="$value"
    done
    ``
    
    So the env vars can be copied from the secret store (e.g. vault) to the current shell's environment by sourcing that script (After the correct secret retrieval command is swapped in, of course)
    

    【讨论】:

    • 根据您的 bash 版本,不需要trup_name=${name^^}
    • 哦,太好了!我每天都在学习一些关于 bash 的新知识。谢谢!编辑:我需要什么版本的 bash?我在 3.2.5 上,但它不起作用。说'糟糕的替代'
    • 我认为在 4.0 版本中添加了大小写修饰符。如果您使用的是 Mac,则可以通过 Homebrew (brew.sh) 安装更新的 bash
    • 这是 Apple 的错:他们不想用 GPL 版本 3 “感染” MacOS。
    猜你喜欢
    • 2019-07-28
    • 1970-01-01
    • 2011-06-15
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    相关资源
    最近更新 更多