我的脚本需要一些帮助。
我有这样的环境变量:
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