Bash - Gitlab CI 没有将变量转换为字符串

Bash - Gitlab CI not converting variable to a string

我正在使用 GitLab 部署一个项目,并在 GitLab 控制台中设置了一些环境变量,我在下面的 GitLab 部署脚本中使用了这些变量:

- export S3_BUCKET="$(eval $S3_BUCKET_${CI_COMMIT_REF_NAME^^})"
- aws s3 rm s3://$S3_BUCKET --recursive

我的环境变量是这样声明的:

Key: s3_bucket_development
Value: https://dev.my-bucket.com

Key: s3_bucket_production
Value: https://prod.my-bucket.com

计划是根据尝试部署的分支 (CI_COMMIT_REF_NAME) 从环境变量中获取存储桶 URL。

问题是 S3_BUCKET 变量似乎没有正确设置,我收到以下错误:

> export S3_BUCKET=$(eval $S3_BUCKET_${CI_COMMIT_REF_NAME^^})
> /scripts-30283952-2040310190/step_script: line 150: https://dev.my-bucket.com: No such file or directory

它似乎可以很好地获取环境变量值,但设置不正确 - 知道为什么吗?

你基本上是在告诉 bash 执行名为 https://dev.my-bucket.com 的命令,这显然不存在。

因为你想在使用 VAR=$(command) 时分配命令的 output 你应该使用 echo

export S3_BUCKET=$(eval echo $S3_BUCKET_${CI_COMMIT_REF_NAME^^})

简单测试:

VAR=HELL; OUTPUT="$(eval echo "$S${VAR^^}")"; echo $OUTPUT
/bin/bash

动态创建SHELL变量,然后打印成功

您似乎在尝试根据 CI_COMMIT_REF_NAME 的值获取变量 S3_BUCKET_DEVELOPMENTS3_BUCKET_PRODUCTION 的值,您可以使用参数间接寻址来实现:

$ a=b
$ b=c
$echo "${!a}" # c

在你的情况下,你还需要一个临时变量,像这样的东西可能会起作用:

- s3_bucket_variable=S3_BUCKET_${CI_COMMIT_REF_NAME^^}
- s3_bucket=${!s3_bucket_variable}
- aws s3 rm "s3://$s3_bucket" --recursive