Переменная jq --arg, используемая в строке в кавычках в select () - PullRequest
0 голосов
/ 05 октября 2018

Я хочу select() объект, основанный на строке, содержащей переменную jq ($ARCH), используя аргумент -arg jq.Вот пример использования при поиске "/bin/linux/$ARCH/kubeadm" из Google ...

# 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 не транслитерируется внутри кавычек.Я знаю, что могу обойти это с помощью множественного выбора / содержит (), но я бы предпочел не делать этого, если это возможно.

jq просто может этого не делать, но если кто-то знает способ сделать это,Я был бы очень признателен.

1 Ответ

0 голосов
/ 05 октября 2018

jq поддерживает интерполяцию строк, и в вашем случае строка будет выглядеть следующим образом:

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

Обратите внимание, что это не строка JSON: появление "\(" сигнализирует о том, что строка подлежит интерполяции,Очень изящно.

(В качестве альтернативы вы можете, конечно, использовать конкатенацию строк: "/bin/linux/" + $ARCH + "/kubeadm")

Кстати, вы можете избежать contains здесь.Его семантика довольно сложна и, возможно, нелогична.Попробуйте использовать startswith, index или (для совпадений регулярных выражений) test.

...