[英]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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.