jq --arg 在 select() 中引用的字符串中使用的变量

jq --arg variable used in quoted string within select()

我想 select() 使用 -arg jq 参数基于包含 jq 变量 ($ARCH) 的字符串的对象。这是从 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"))]'

...其中 returns 是一个空集,因为 jq 不会在引号内音译。我知道我可以通过使用多个 select/contains() 来解决这个问题,但如果可能的话我不想这样做。

jq 可能根本做不到,但如果有人知道这样做的方法,我将不胜感激。

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

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

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

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

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