在循环中导出变量

在循环中导出变量

我的脚本需要一些帮助。

我有这样的环境变量:

SECRET_OF_AN_APP_dev=123
SECRET_OF_AN_APP_test=456

SECRET_OF_AN_APP_prod=789

我想要一个可以改变的脚本秘密_OF_AN_APP_dev=123秘密_OF_AN_APP=123并在第一次迭代中将其导出到 env 中,然后秘密_OF_AN_APP_测试=456改成秘密_OF_AN_APP=456在第二次迭代等中

#!/bin/bash
APP_SECRET=SECRET_OF_AN_APP
ENVIRONMENT_NAME=dev
LIST_OF_ENVIRONMENTS=[dev, prod, test...]

for i in $LIST_OF_ENVIRONMENTS
do
APP_SECRET=$(env | grep APP_SECRET_$i | sed 's/APP_SECRET_'"$i"'=//g' ) >> var.bash


. ./var.bash

./some_script_where_$APP_SECRET_is_required.sh

done

我认为我的脚本正在像子 shell 一样工作,因为当我这样做时:echo $SECRET_OF_AN_APP,它是空白的。

我需要设置它,因为在此循环中执行的其他脚本需要这些变量。

我尝试过export,与./var.bash,与set -o allexport,等等。

什么都不起作用。

我需要在 shell 中包含“echo $SECRET_OF_AN_APP”,而不仅仅是脚本。它正在按脚本运行。但它没有在我的环境变量中设置。

答案1

困扰您的一个问题是您env | grep APP_SECRET_$i没有将 APP_SECRET 的值替换为预期的 SECRET_OF_AN_APP 变量名称。向 APP_SECRET 添加变量扩展来解决这个问题。

您已将 的输出捕获$(env ...)到赋值 APP_SECRET 中,然后将该赋值的输出重定向到文件。命令替换的输出可能是正确的,并被赋值给 APP_SECRET,但该赋值的文本未出现在输出文件中。

要么导出 APP_SECRET(因为它是在此 shell 脚本中分配的),要么在获取它之前将分配打印到文件中并跳过分配的重定向。

任何一个:

export APP_SECRET

或者:

APP_SECRET=$(varname=${APP_SECRET}_${i}; printf '%s' "${!varname}" )
declare -p APP_SECRET >> var.bash
echo "export APP_SECRET" >> var.bash # if you need it to be exported 

我已经简化了您的命令替换,以便它组合一个变量来保存您想要的实际变量值的名称。请注意此处使用大括号,以免下划线被视为 APP_SECRET 变量的一部分。然后我们使用bash的变量间接扩展将“varname”扩展为变量的名称,然后取值多变的。例如,这会将“varname”翻译为“SECRET_OF_AN_APP_dev”,然后查找其值(例如123)。

如果在此脚本退出后您的 shell 需要使用 APP_SECRET 的值,则您的父 shell 需要在 var.bash 文件中获取源:

. ./var.bash

也可以看看:

答案2

这是您要找的吗?

#!/bin/bash
SECRET_OF_AN_APP_dev=123
SECRET_OF_AN_APP_test=456
SECRET_OF_AN_APP_prod=789

for s in dev test prod
do
   name=SECRET_OF_AN_APP_$s
   echo $name
   SECRET_OF_AN_APP=${!name}
   echo $SECRET_OF_AN_APP
   export SECRET_OF_AN_APP
   some_app_which_uses_that_variable
done

相关内容