jq --arg变量,用于select()

时间:2018-10-05 19:33:20

标签: json command-line-arguments jq string-interpolation

我想使用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可能根本不这样做,但是如果有人知道这样做的方法,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

jq确实支持字符串插值,在您的情况下,字符串为:

"/bin/linux/\($ARCH)/kubeadm"

请注意,这不是JSON字符串:"\("的出现表示该字符串需要插值。非常漂亮。

(或者,您当然可以使用字符串连接: "/bin/linux/" + $ARCH + "/kubeadm"

顺便说一句,您可能希望在这里避免使用contains。它的语义非常复杂,甚至可能违反直觉。考虑使用startswithindex或(对于正则表达式匹配)test