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
。它的语义是(是?)相当复杂并且可能违反直觉。考虑使用 startswith
、index
或(对于正则表达式匹配)test
.
我想 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
。它的语义是(是?)相当复杂并且可能违反直觉。考虑使用 startswith
、index
或(对于正则表达式匹配)test
.