【问题标题】:Evaluate each environment variable and set it back in ubuntu评估每个环境变量并将其设置回 ubuntu
【发布时间】:2016-07-26 17:49:54
【问题描述】:

我正在尝试编写一个读取所有环境变量的 shell 脚本,评估它们是否包含 env。变量在其中并在评估后重新导出。

示例 - 我有一个这样暴露的环境变量:

echo $JVM_OPTS                 
-Djava.awt.headless=true -Xmx1600m  -Djava.rmi.server.hostname=${CONTAINER_IP} -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Duser.language=en -Duser.country=US -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0


echo $CONTAINER_IP 
10.44.214.63

现在,我需要评估“JVM_OPTS”变量并将 $JVM_OPTS 中的 ${CONTAINER_IP} 的值替换为 10.44.214.63。最后,将此评估值设置回 JVM_OPTS 变量中。

样本输出:

echo $JVM_OPTS                 
    -Djava.awt.headless=true -Xmx1600m  -Djava.rmi.server.hostname=10.44.214.63 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Duser.language=en -Duser.country=US -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0

到目前为止我的分析: 我写了下面的代码来完成任务

#!/bin/bash

for path in $(printenv); do
    path=`eval echo $path`
    echo $path
done

printenv 会给出整个环境。变量与值一起。我只需要名称,然后使用该值。

如何做到这一点?

【问题讨论】:

  • JVM_OPTS 的分配地点/时间?能不能不直接安排CONTAINER_IP之前赋值JVM_OPTS,这样就可以正常展开值了?
  • 没有。实际上 CONTAINER_IP 是作为参数发送给 Docker 运行的。在编译 Docker 时设置变量 JVM_OPTS。所以直到运行时我才知道 CONTAINER_IP 的值。
  • 您可以在启动时将CONTAINER_IP 值附加到预设的JVM_OPTS,即使该值的其余部分是在映像创建时设置的。

标签: bash shell ubuntu environment-variables


【解决方案1】:

试试

for path in $(compgen -e) ; do
    eval "$path=\"${!path//\"/\\\"}\""
done

但请参阅Why should eval be avoided in Bash, and what should I use instead?,了解有关使用eval 的陷阱的信息。

compgen -e 打印环境变量列表。

${!path} 求值为名称为 $path 的变量的值。

//\"/\\\" 将变量值中的" 替换为\",以保留嵌入的双引号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 2018-02-11
    • 2021-08-28
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多