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

Jim*_*Jim 3 json string-interpolation command-line-arguments jq

我想要select()一个基于包含 jq 变量 ( $ARCH) 的字符串的对象,使用-argjq 参数。这是从 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:
Run Code Online (Sandbox Code Playgroud)
#!/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
Run Code Online (Sandbox Code Playgroud)

然后运行以下命令:

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"))]'
Run Code Online (Sandbox Code Playgroud)

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

jq可能根本不会这样做,但如果有人知道一种方法,我将非常感激。

pea*_*eak 8

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

"/bin/linux/\($ARCH)/kubeadm"
Run Code Online (Sandbox Code Playgroud)

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

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

顺便说一句,您可能希望避开contains这里。它的语义(是?)相当复杂,甚至可能违反直觉。考虑使用startswith, index, or (用于正则表达式匹配)test