Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash/shell jq解析为aws json中的变量_Json_Bash_Shell_Amazon Web Services_Jq - Fatal编程技术网

bash/shell jq解析为aws json中的变量

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

我试图从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 '.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
选项。