bash/shell jq解析为aws json中的变量
我试图从aws结果解析json结果,但当我使用$ip时,我得到了错误或null,当我使用特定的ip时,它工作。在jq命令中使用变量时出错bash/shell jq解析为aws json中的变量,json,bash,shell,amazon-web-services,jq,Json,Bash,Shell,Amazon Web Services,Jq,我试图从aws结果解析json结果,但当我使用$ip时,我得到了错误或null,当我使用特定的ip时,它工作。在jq命令中使用变量时出错 #!/bin/bash aws ec2 describe-addresses --region eu-west-1 > 1.txt ipList=( "52.16.121.238" "52.17.250.188" ) for ip in "${ipList[@]}"; do echo $ip cat 1.txt | jq '.Addr
#!/bin/bash
aws ec2 describe-addresses --region eu-west-1 > 1.txt
ipList=( "52.16.121.238" "52.17.250.188" )
for ip in "${ipList[@]}";
do
echo $ip
cat 1.txt | jq '.Addresses | .[] | select (.PublicIp==$ip) | .InstanceId'
#echo $result
done
请注意。您在jq程序中使用了单引号,这导致shell变量无法插值。此外,即使是这样,您仍然需要在变量插值周围添加字符串引号,以使jq将其解释为字符串文字。由于将shell变量插值到jq程序中比较困难且容易出错,因此jq提供了一个命令行参数,
--arg
,用于将shell变量提升到jq变量中。因此,您的jq调用将如下所示:
jq--arg ip“$ip”。地址[]|选择(.PublicIp==$ip)|。实例ID'
感谢您的帮助。正确的格式是:
cat 1.txt | jq ".Addresses | .[] | select(.PublicIp==\"$ip\") | .InstanceId"
看一看:不,仍然不起作用用“stll不起作用”的细节编辑你的问题。考虑到
1.txt
的未知内容,很难猜测您可能会收到什么错误消息。另外,我假设您正在使用良好的实践,并且只处理cat1.txt | jq…
的问题行,这就是为什么下面的echo result
被注释掉了,并且您没有显示像result=$(…某物…
这样的赋值。祝好运。@ CfCioo:用双引号中断单引号:<代码> CAT1.TXT*JQ。地址[]]选择(.PrimePi=='' $ IP '').StasnIdID < /C>。您可能还想考虑使用-Queq选项,例如:AWS EC2描述地址——查询“地址[*].PusiICP”-输出TeXTURE,jq
读取文件名参数,因此cat
是。这不是个好主意。您应该尝试保持筛选器字符串不变。如果要对其进行参数化,请使用--arg
选项。