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_DEVELOPMENT
和 S3_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
我正在使用 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_DEVELOPMENT
和 S3_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