繁体   English   中英

Bash:在一行中改进变量间接赋值

[英]Bash : improve variable indirection assignment in one line

在我的 Gitlab 项目中,我设置了 Gitlab 变量MY_VAR_DEVMY_VAR_PROD

根据以下代码,根据提交分支,我希望 CI/CD 管道(.gitlab-ci.yml 文件)上有不同的行为:

- if [ $CI_COMMIT_BRANCH == "dev" ]; then export ENV="DEV"; fi
- if [ $CI_COMMIT_BRANCH == "prod" ]; then export ENV="PROD"; fi
- TMP_MY_VAR="MY_VAR_${ENV}"
- export MY_VAR=$( eval echo \$$TMP_MY_VAR )
#- ... bla bla with $MY_VAR use

有没有办法合并最后两行并直接影响MY_VAR的评估值MY_VAR_${ENV} (我的意思是不使用TMP_MY_VAR

谢谢您的帮助:)

这不是间接赋值,而是间接取消引用。 假设 bash 4.x:

# append all-caps version of CI_COMMIT_BRANCH contents to MY_VAR_prefix
var="MY_VAR_${CI_COMMIT_BRANCH^^}"

# dereference variable created above, assign result to MY_VAR
MY_VAR=${!var}

...当然,您可以将整个事情变成一行:

var="MY_VAR_${CI_COMMIT_BRANCH^^}"; MY_VAR=${!var}

稍微重复一下自己的话,有话要说。

- if [ "$CI_COMMIT_BRANCH" = "dev" ]; then MY_VAR=$MY_VAR_DEV; fi
- if [ "$CI_COMMIT_BRANCH" = "prod" ]; then MY_VAR=$MY_VAR_PROD; fi
- export MY_VAR
#- ... bla bla with $MY_VAR use

或者

- case $CI_COMMIT_BRANCH in dev) MY_VAR=$MY_VAR_DEV ;; prod) MY_VAR=$MY_VAR_PROD ;; esac
- export MY_VAR

没有必要通过间接参数扩展使事情复杂化,特别是如果您使用的是不支持它的 shell 没有极其脆弱的使用eval

(除非MY_VAR被您的 shell执行的另一个程序使用,否则不需要导出。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM