此问题已在此处有答案:
Difference between single and double quotes in Bash(7个回答)
22天前关闭
我可以使用terraform执行api-call,但不能使用bash。
这个terraform代码工作:
curl -X POST https://circleci.com/api/v2/project/gh/some-organization/${var.repository_name}/envvar \
-H 'Content-Type: application/json' \
-H 'Circle-Token: ${data.aws_ssm_parameter.ct[0].value}' \
-d '{"name":"AWS_ACCOUNT_ID_${upper(var.environment)}","value":"${data.aws_caller_identity.current.account_id}"}'
这是我的bash代码,不工作:
#!/bin/bash
user=$1
repo=$2
lower_env=$3
env=$(echo "$lower_env" | tr '[:lower:]' '[:upper:]')
token="1234567890"
......
NEW_ACCESS_KEY_ID="$(aws iam list-access-keys --user-name $user | jq -r '.AccessKeyMetadata[].AccessKeyId')"
......
curl -X POST https://circleci.com/api/v2/project/gh/some-organization/$repo/envvar \
-H 'Content-Type: application/json' \
-H 'Circle-Token:${token}' \
-d '{"name":"AWS_ACCESS_KEY_ID_${env}","value":"\'$NEW_ACCESS_KEY_ID'\"}'
据我所知,主要问题发生在curl内部传递变量token时,我尝试屏蔽- ' '\ -但没有运气。
-H 'Content-Type: application/json' \
-H 'Circle-Token: \'$token'\' \
-d '{"name":"AWS_SECRET_ACCESS_KEY_${upper(\'$env'\}","value":"\'$NEW_SECRET_ACCESS_KEY'\"}'
我试着从bash中回显curl本身,它看起来是正确的:
curl -X POST https://circleci.com/api/v2/project/gh/some-ogranization/repo-from-token/envvar -H 'Circle-Token: 1234567890'
工作代码,解决方案:
curl -X POST "https://circleci.com/api/v2/project/gh/some-organization/$repo/envvar" \
-H "Content-Type: application/json" \
-H "Circle-Token: $token" \
-d "{\"name\":\"AWS_ACCESS_KEY_ID_${env}\",\"value\":\"$NEW_ACCESS_KEY_ID\"}"
1条答案
按热度按时间hmtdttj41#
我认为问题在于传递
Circle-Token
头的语法,你使用${data.aws_ssm_parameter.ct[0].value}
来插值Circle-Token
头的值,你在Circle-Token
头的值周围使用了单引号('
),这阻止了变量插值,所以只需要使用双引号("
)!如果你愿意,你可以减少
-d
参数中的转义,只将变量暴露给shell进行解释,而不是整个参数字符串,或者通过串联:或者调用
printf
:或者通过填充一个变量来用作该参数:
或:
接着是: