【问题标题】:Dynamic Environment Variable in KSHKSH 中的动态环境变量
【发布时间】:2020-02-26 13:44:37
【问题描述】:

我必须在 KSH 中编写一个脚本来定义和使用动态环境变量。

它应该读取以下格式的文件

 DEV  server_name  DEV_Server
 QA   server_name  QA_Server
 PROD server_name  PROD_Server

所以如果脚本要在DEV中执行,它会被调用如下:

     Invocation            Value of server_name
 **script.sh DEV**               DEV_Server
 **script.sh QA**                QA_Server

关于如何在 KSH 中实现动态变量的任何线索?

【问题讨论】:

  • 具体是哪个 ksh 实现?如果是 ksh93,这就是 bash 获得 namevar 功能的地方。
  • 如何找到 ksh 的实现?
  • 也就是说,一个很好的问题会排除与您遇到的问题无关的所有内容——如果您不知道如何读取文件,那应该是一个单独的 问题。
  • 好吧,首先,您是如何安装 ksh 的?或者您使用的是哪个操作系统?如果您使用的是 MacOS 附带的,我们知道它是 ksh93。如果它随 Linux 一起提供,它可能是真正的 David Korn ksh,或者它可能是众多可怕的克隆之一。你的包管理员应该知道。
  • 你能举一个输入输出的具体例子吗?我不太明白你想要发生什么。

标签: linux shell ksh


【解决方案1】:

使用 ksh93v 或更高版本,您可以使用 typeset -n 使名称引用不同的动态定义变量:

# recommended syntax for ksh but not bash; in ksh, makes all variables local by default
# does not have that effect in bash, and is best avoided there.
function indirect_assign { nameref _dest=$1; _dest=$2; }

while read -r env_name var_name var_value; do
  [[ $env_name = "$1" ]] || continue
  indirect_assign "$var_name" "$var_value"
  export "$var_name"
done

请注意,需要获取此代码(或作为函数体调用)才能对调用 shell 产生任何影响。

【讨论】:

  • 重读问题时,刚才看到您指定的是动态环境变量,而不仅仅是动态shell 变量。需要一个明确的export 来完成它;适当编辑。
  • 我怎么称呼这个indirect_assign?
  • 代码中的调用indirect_assign "$var_name" "$var_value" 应用作演示。如果您已在交互式 shell 中定义了该函数,则可以类似地运行 indirect_assign "my_var" "my value"
猜你喜欢
  • 2014-05-16
  • 2020-04-04
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
相关资源
最近更新 更多