Bash变量嵌套取值问题:动态变量无法获取实际值求助
Bash动态变量解析问题:如何获取嵌套变量的实际值?
你的问题核心在于,你只是把变量名的字符串(比如$DEV_DB_USERNAME)赋值给了DB_USERNAME,但Bash不会自动对这个字符串进行二次变量解析,所以最终输出的是字符串本身而非变量的实际值。下面给你两种可行的解决方案,其中第二种更安全推荐:
方案1:使用eval触发二次解析
eval命令会将传入的字符串当作Bash命令执行,我们可以利用它来完成变量的动态赋值:
#!/usr/bin/env bash export TRAVIS_BRANCH="deploy-dev" export DEV_DB_USERNAME="goodguy" IFS="-" read TR_BRANCH DB_ENV TRAVIS_BRANCH <<< "$TRAVIS_BRANCH" DB_ENV_UC=$(echo "$DB_ENV" | tr '[:lower:]' '[:upper:]') if [[ ${TR_BRANCH} == "deploy" ]] then # 用eval执行赋值命令,完成变量解析 eval DB_USERNAME=\$${DB_ENV_UC}_DB_USERNAME else eval DB_USERNAME=\$${DB_ENV_UC}_LAB_DB_USERNAME fi echo "username is $DEV_DB_USERNAME" echo "username is $DB_USERNAME"
执行这个脚本,第二个echo就会输出goodguy了。不过要注意:eval存在安全风险,如果你的环境变量内容不可控(比如包含特殊字符、命令注入内容),可能会导致意外执行,所以在CI这种环境变量完全可控的场景下可以用,但更推荐下面的方案。
方案2:使用Bash间接引用(推荐)
Bash支持${!变量名}的间接引用语法,它会把变量中存储的字符串当作目标变量名,然后返回该目标变量的实际值,这种方式更安全,没有命令注入风险:
#!/usr/bin/env bash export TRAVIS_BRANCH="deploy-dev" export DEV_DB_USERNAME="goodguy" IFS="-" read TR_BRANCH DB_ENV TRAVIS_BRANCH <<< "$TRAVIS_BRANCH" DB_ENV_UC=$(echo "$DB_ENV" | tr '[:lower:]' '[:upper:]') # 先拼接出完整的目标变量名 if [[ ${TR_BRANCH} == "deploy" ]] then target_var="${DB_ENV_UC}_DB_USERNAME" else target_var="${DB_ENV_UC}_LAB_DB_USERNAME" fi # 用间接引用获取实际值 DB_USERNAME="${!target_var}" echo "username is $DEV_DB_USERNAME" echo "username is $DB_USERNAME"
这个脚本执行后,DB_USERNAME会正确拿到DEV_DB_USERNAME的实际值goodguy,完全符合你的需求。这种方法是Bash原生支持的安全方案,非常适合你这种根据分支动态匹配环境变量的场景。
内容的提问来源于stack exchange,提问作者tman
相关产品推荐
相关产品推荐

