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

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

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

ABCDEF
123456
AAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBB

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

export AWS_ACCESS_KEY_ID=<the first line of the output>
export AWS_SECRET_KEY=<the second line of the output>
export AWS_SESSION_TOKEN=<the third line of the output>


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

<some commands that output a json> | jq -r '.Credentials | .AccessKeyId, .SecretKey, .SessionToken' | export AWS_ACCESS_KEY_ID=`awk 'NR==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直接安全的代码。

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

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

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所建议的,你可以使用这样的东西:

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

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

{ 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')"
export AWS_ACCESS_KEY_ID AWS_SECRET_KEY AWS_SESSION_TOKEN


这是一个概念证明:

$ unset a b c

$ { read -r a && read -r b && read -r c; }<< EOF
$(cat t.txt)
EOF

$ echo $a $b $c
ABCDEF 123456 AAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBB

$ unset a b c

$ { read -r a && read -r b && read -r c; }<<<"$(cat t.txt)"

$ echo $a $b $c
ABCDEF 123456 AAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBBAAAAAABBBBB

bvhaajcl

bvhaajcl3#

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

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#

我会这样做

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

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

相关问题