shell 导出从单个jq调用中提取的多个环境变量

wz1wpwve  于 2023-08-07  发布在  Shell
关注(0)|答案(4)|浏览(208)

当我使用
第一个月
我得到以下输出:

  1. ABCDEF
  2. 123456
  3. AAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBB

字符串
三条不同的线和不同的键。
我想将这些输出作为导出导出:

  1. export AWS_ACCESS_KEY_ID=<the first line of the output>
  2. export AWS_SECRET_KEY=<the second line of the output>
  3. export AWS_SESSION_TOKEN=<the third line of the output>


我该如何做到这一点(并仍然保持与oneliner)?
我试着做了以下几件事:

  1. <some commands that output a json> | jq -r '.Credentials | .AccessKeyId, .SecretKey, .SessionToken' | export AWS_ACCESS_KEY_ID=`awk 'NR==1'`


它是有效的但是

  1. <some commands that output a json> | jq -r '.Credentials | .AccessKeyId, .SecretKey, .SessionToken' | export AWS_ACCESS_KEY_ID=`awk 'NR==1'; export AWS_SECRET_KEY=`awk 'NR==2'`


挂起。
我用zsh。

nkhmeac6

nkhmeac61#

其他答案尚未讨论的一个选项是使用jq @sh过滤器来生成对eval直接安全的代码。

  1. eval "$(printf '%s\n' "$json" | jq -r '
  2. .Credentials | ("export AWS_ACCESS_KEY=\(.AccessKeyId | @sh)",
  3. "export AWS_SECRET_KEY=\(.SecretKey | @sh)",
  4. "export AWS_SESSION_TOKEN=\(.SessionToken | @sh)")')"

字符串
请注意,上面的代码可能只是一行,为了可读性起见,我们将其分解为三个单独的shell命令:

  1. eval "$(printf '%s\n' "$json" | jq -r '.Credentials | "export AWS_ACCESS_KEY=\(.AccessKeyId | @sh) AWS_SECRET_KEY=\(.SecretKey | @sh) AWS_SESSION_TOKEN=\(.SessionToken | @sh)"')"


这种方法的一个优点是,它可以正确地处理包含文本换行符的键或标记,这是目前没有其他答案提供的。

gtlvzcf8

gtlvzcf82#

正如Charles Duffy所建议的,你可以使用这样的东西:

  1. { read -r AWS_ACCESS_KEY_ID && read -r AWS_SECRET_KEY && read -r AWS_SESSION_TOKEN; } << EOF
  2. $(<some commands that output a json> | jq -r '.Credentials | .AccessKeyId, .SecretKey, .SessionToken')
  3. EOF
  4. export AWS_ACCESS_KEY_ID AWS_SECRET_KEY AWS_SESSION_TOKEN

字符串
另外,正如Charles所建议的,您可以使用here string,如下所示:

  1. { read -r AWS_ACCESS_KEY_ID && read -r AWS_SECRET_KEY && read -r AWS_SESSION_TOKEN; } <<<"$(some commands that output a json | jq -r '.Credentials | .AccessKeyId, .SecretKey, .SessionToken')"
  2. export AWS_ACCESS_KEY_ID AWS_SECRET_KEY AWS_SESSION_TOKEN


这是一个概念证明:

  1. $ unset a b c
  2. $ { read -r a && read -r b && read -r c; }<< EOF
  3. $(cat t.txt)
  4. EOF
  5. $ echo $a $b $c
  6. ABCDEF 123456 AAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBB
  7. $ unset a b c
  8. $ { read -r a && read -r b && read -r c; }<<<"$(cat t.txt)"
  9. $ echo $a $b $c
  10. ABCDEF 123456 AAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBB

展开查看全部
bvhaajcl

bvhaajcl3#

这个答案是建立在查尔斯·达菲的基础上的。这是专门为承担一个角色,这是一行,这是很容易别名。请记住将AWS_ACCOUNT_ID和ROLE_NAME替换为您的。

  1. eval "$(printf '%s\n' $(aws sts assume-role --role-arn arn:aws:iam::AWS_ACCOUNT_ID:role/ROLE_NAME --role-session-name AWSCLISession) | jq -r '.Credentials | "export AWS_ACCESS_KEY_ID=\(.AccessKeyId | @sh) AWS_SECRET_ACCESS_KEY=\(.SecretAccessKey | @sh) AWS_SESSION_TOKEN=\(.SessionToken | @sh)"')"

字符串

efzxgjgh

efzxgjgh4#

我会这样做

  1. for i in AWS_ACCESS_KEY_ID AWS_SECRET_KEY AWS_SESSION_TOKEN; do
  2. read "$i" &&
  3. export "$i"
  4. done \
  5. < <(json commands |
  6. jq -r '...')

字符串
只有在成功读取某些内容时才导出变量。如果您希望将它们导出(空),只需删除“and”运算符(&&)。

相关问题