shell 发送变量内 curl 与''屏蔽[重复]

i7uq4tfw  于 2023-10-23  发布在  Shell
关注(0)|答案(1)|浏览(118)

此问题已在此处有答案

Difference between single and double quotes in Bash(7个回答)
22天前关闭
我可以使用terraform执行api-call,但不能使用bash。
这个terraform代码工作:

  1. curl -X POST https://circleci.com/api/v2/project/gh/some-organization/${var.repository_name}/envvar \
  2. -H 'Content-Type: application/json' \
  3. -H 'Circle-Token: ${data.aws_ssm_parameter.ct[0].value}' \
  4. -d '{"name":"AWS_ACCOUNT_ID_${upper(var.environment)}","value":"${data.aws_caller_identity.current.account_id}"}'

这是我的bash代码,不工作:

  1. #!/bin/bash
  2. user=$1
  3. repo=$2
  4. lower_env=$3
  5. env=$(echo "$lower_env" | tr '[:lower:]' '[:upper:]')
  6. token="1234567890"
  7. ......
  8. NEW_ACCESS_KEY_ID="$(aws iam list-access-keys --user-name $user | jq -r '.AccessKeyMetadata[].AccessKeyId')"
  9. ......
  10. curl -X POST https://circleci.com/api/v2/project/gh/some-organization/$repo/envvar \
  11. -H 'Content-Type: application/json' \
  12. -H 'Circle-Token:${token}' \
  13. -d '{"name":"AWS_ACCESS_KEY_ID_${env}","value":"\'$NEW_ACCESS_KEY_ID'\"}'

据我所知,主要问题发生在curl内部传递变量token时,我尝试屏蔽- ' '\ -但没有运气。

  1. -H 'Content-Type: application/json' \
  2. -H 'Circle-Token: \'$token'\' \
  3. -d '{"name":"AWS_SECRET_ACCESS_KEY_${upper(\'$env'\}","value":"\'$NEW_SECRET_ACCESS_KEY'\"}'

我试着从bash中回显curl本身,它看起来是正确的:

  1. curl -X POST https://circleci.com/api/v2/project/gh/some-ogranization/repo-from-token/envvar -H 'Circle-Token: 1234567890'

工作代码,解决方案:

  1. curl -X POST "https://circleci.com/api/v2/project/gh/some-organization/$repo/envvar" \
  2. -H "Content-Type: application/json" \
  3. -H "Circle-Token: $token" \
  4. -d "{\"name\":\"AWS_ACCESS_KEY_ID_${env}\",\"value\":\"$NEW_ACCESS_KEY_ID\"}"
hmtdttj4

hmtdttj41#

我认为问题在于传递Circle-Token头的语法,你使用${data.aws_ssm_parameter.ct[0].value}来插值Circle-Token头的值,你在Circle-Token头的值周围使用了单引号('),这阻止了变量插值,所以只需要使用双引号(")!

  1. #!/bin/bash
  2. user=$1
  3. repo=$2
  4. lower_env=$3
  5. env=${lower_env^^}
  6. token="1234567890"
  7. ......
  8. NEW_ACCESS_KEY_ID="$(aws iam list-access-keys --user-name $user | jq -r '.AccessKeyMetadata[].AccessKeyId')"
  9. ......
  10. curl -X POST "https://circleci.com/api/v2/project/gh/some-organization/$repo/envvar" \
  11. -H "Content-Type: application/json" \
  12. -H "Circle-Token: $token" \
  13. -d "{\"name\":\"AWS_ACCESS_KEY_ID_${env}\",\"value\":\"$NEW_ACCESS_KEY_ID\"}"

如果你愿意,你可以减少-d参数中的转义,只将变量暴露给shell进行解释,而不是整个参数字符串,或者通过串联:

  1. curl ...
  2. -d '{"name":"AWS_ACCESS_KEY_ID_'"${env}"'","value":"'"$NEW_ACCESS_KEY_ID"'"}'

或者调用printf

  1. curl ...
  2. -d "$(printf '{"name":"AWS_ACCESS_KEY_ID_%s","value":"%s"}' "$PWD" "$HOME")"

或者通过填充一个变量来用作该参数:

  1. data='{"name":"AWS_ACCESS_KEY_ID_'"${env}"'","value":"'"$NEW_ACCESS_KEY_ID"'"}'

或:

  1. printf -v data '{"name":"AWS_ACCESS_KEY_ID_%s","value":"%s"}' "$env" "$NEW_ACCESS_KEY_ID"

接着是:

  1. curl ...
  2. -d "$data"
展开查看全部

相关问题