我想使用select()
jq参数基于包含jq变量($ARCH
)的字符串-arg
创建对象。这是从Google查找“ /bin/linux/$ARCH/kubeadm
”时的用例...
# You may need to install `xml2json` IE
# sudo gem install --no-rdoc --no-ri xml2json and run the script I wrote to do the xml2json:
#!/usr/bin/ruby
# Written by Jim Conner
require 'xml2json'
xml = ARGV[0]
begin
if xml == '-'
xdata = ARGF.read.chomp
puts XML2JSON.parse(xdata)
else
puts XML2JSON.parse(File.read(file2parse).chomp)
end
rescue => e
$stderr.puts 'Unable to comply: %s' % [e.message]
end
然后运行以下命令:
curl -sSL https://storage.googleapis.com/kubernetes-release/ > /var/tmp/k8s.xml | \
xml2json - | \
jq --arg ARCH amd64 '[.ListBucketResult.Contents[] | select(.Key | contains("/bin/linux/$arch/kubeadm"))]'
...将返回一个空集,因为jq
不会在引号内进行音译。我知道我可以通过使用多个select / contains()来解决此问题,但我宁愿不要这样做。
jq
可能根本不这样做,但是如果有人知道这样做的方法,我将不胜感激。
答案 0 :(得分:1)
jq确实支持字符串插值,在您的情况下,字符串为:
"/bin/linux/\($ARCH)/kubeadm"
请注意,这不是JSON字符串:"\("
的出现表示该字符串需要插值。非常漂亮。
(或者,您当然可以使用字符串连接:
"/bin/linux/" + $ARCH + "/kubeadm"
)
顺便说一句,您可能希望在这里避免使用contains
。它的语义非常复杂,甚至可能违反直觉。考虑使用startswith
,index
或(对于正则表达式匹配)test
。