【问题标题】:bash - get a list of environment variables with proper handling of new linesbash - 获取正确处理新行的环​​境变量列表
【发布时间】:2021-11-14 08:34:37
【问题描述】:
$ export MYVAR=$(echo -e "something\nMYVAR=10")
$ env
...
MYVAR=something
MYVAR=10
...

上面的代码显示了问题。 如果您尝试使用简化版本阅读此内容(很多人都这样做),您将得到错误的值。这解释了它:

$ env | while IFS== read var value; do
    [ "$var" == "MYVAR" ] && echo $value
done
someting
10

经过长时间的调查,我想知道bashsh 是否根本无法处理这种情况。

如果我能得到一个没有值的变量列表,我可以解决它,但看起来没有外部任务(例如 python)我做不到......

问题:如何在 shell 中获取环境变量列表及其值,这些值适用于上述示例?

【问题讨论】:

  • env 的输出中,您无法分辨什么是赋值,什么是值,即使在 python 中也是如此。使用env -0
  • @choroba 错了。在 python 中,您可以调用for k, v in os.environ.items() 并以适当的方式获取它们。然后我可以从脚本调用这样的脚本并获取变量,但我不想这样做。我正在寻找一个纯粹的 bash 解决方案。
  • 使用os.environ 不是使用“env 的输出”:-)

标签: linux bash newline


【解决方案1】:

正如 choroba 指出的,您可以使用 env -0

export MYVAR="$(echo -e "something\nMYVAR=10")"

env -0 | while IFS== read -d '' -r var value; do
    [ "$var" = "MYVAR" ] && echo "$value"
done
something
MYVAR=10

【讨论】:

    【解决方案2】:

    env 只显示导出的环境。

    compgen -A variable
    

    将为您提供所有环境变量的列表 - 包括未导出的变量。

    然后您可以针对其中的每一个运行:

    typeset -p "$@"
    

    获取完整的声明。

    或者你可以得到所有的声明:

    typeset -p
    

    【讨论】:

    • 虽然菲利普给了我我所需要的东西,但还是非常感谢你。我被“壳”震惊了(打算平底船。)我从来没有听说过或使用过这些。简直哇。您是否碰巧知道是否有 compgen -A variable 仅用于导出的?非常感谢!
    • compgen -A export 似乎就是这样做的。
    • 就是这样!丹克!
    【解决方案3】:

    您可以使用awk 来获取环境变量的名称

    $ awk 'BEGIN {for (k in ENVIRON) { print k }}'
    ...
    

    由于保证名称不含换行符,因此您可以将其通过管道传递到您的 shell 循环:

    awk '...' | while read name; do
       value=${!name}
       ...
    done
    

    如果可能的话,或者在awk 中自行处理。

    (在bash 中,您可以使用declare -x 来获得类似于env 产生的输出。如果有一个额外的标志可以用来only环境变量的名称。)

    【讨论】:

    • 检查。我担心我将不得不有一些“额外”的东西。我在一个非常瘦的环境中运行,可能无法访问 awk,所以我一直在寻找纯 bash/sh/ksh,但我没有看到任何解决方案(到目前为止)。
    • 我现在正在提升你,希望我能够使用 awk。我仍然会等待带有env --miracle 选项或类似选项的人:D
    • 无赖。瘦环境没有awk。它有python的好处,所以我总是可以使用python。你的例子给了我虽然我可以使用那个方法而不是 awk。再次感谢您!
    • 啊,我选择了awk,因为它是 POSIX 规范的一部分。
    【解决方案4】:

    查看不带名称的环境变量的一种简单方法是直接回显它(在带引号的字符串内):

    $ export MYVAR=$(echo -e "something\nMYVAR=10")
    $ echo "$MYVAR"
    something
    MYVAR=10
    

    环境变量包含一个换行符后跟“MYVAR=”,使得“env”的输出看起来有点奇怪,但它工作正常。

    【讨论】:

    • 这个例子是用来说明问题的。我正在寻找的解决方案是获取环境变量及其值的列表。如您所见,您无法获得 MYVAR 的正确值。我已经更新了我的帖子,以清楚地说明我的问题的目标是什么。我希望现在很清楚。在您的回答中,您询问“MYVAR”的价值是什么。这不是问题。
    猜你喜欢
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    相关资源
    最近更新 更多