繁体   English   中英

如何传递bash变量并使用jq生成动态JSON?

[英]How can I pass in bash variables and generate dynamic JSON with jq?

我有一堆bash var,我想将其转换为具有特定格式的JSON。 我在将它们作为jq的参数传递给我时遇到了麻烦,并且摸不着头脑如何在jq本身内循环遍历2个数组。 也许我应该先手动--argjson两个数组转换为JSON,然后通过--argjson将该JSON传递给jq?

到目前为止,这是我写的内容。

#!/usr/bin/env bash                                                                                                                                                                                                                       

#example data                                                                                                                                                                                                                             
_assetPair=BTCUSD
_version=0.9.1
_median=103.96
_medianHex="000000000000000000000000000000000000000000000005a2bc1d32419c0000"
_time=1549524531
_timeHex="000000000000000000000000000000000000000000000000000000005c5bde33"
_hash="db035aa02562167d23f657bb6f1030ba962d476f18a51c5c651b6b4b0"
_signature="51cd021f3c3edf1600aafaa81e366cd14543125dd7ec4c1da91765b0e632cfd313a3b8a291153262531e7027163ffe1239ddc9cc42815ddfcf70404a6cb5f2d71b"

#the size of the two below arrays is always equal but not known ahead of time                                                                                                                                                             
#unsure how to pass/use these in jq                                                                                                                                                                                                       
#if I pass in the elements I won't know which handle to call them with in jq                                                                                                                                                              
#maybe need some transpose magic here                                                                                                                                                                                                     
validSources=()
validPrices=()
validSources+=( "Bitfinex" "Poloniex" "Coinbase" )
validPrices+=( "104.61" "102.88" "103.96")

#Create jq input argument list                                                                                                                                                                                                            
_jqArgs=()
_jqArgs=( "--arg assetPair $_assetPair" "--arg version $_version" "--arg median $_median" "--arg median0x $_medianHex" "--arg time $_time" "--arg time0x $_timeHex" "--arg hash ${_hash:2}" "--arg signature ${_signature:2}" )
for index in ${!validSources[*]}; do
    _jqArgs+=( --arg "${validSources[index]}" "${validPrices[index]}" )
done

#sanity check                                                                                                                                                                                                                             
echo "${_jqArgs[@]}"

#generate json                                                                                                                                                                                                                            
jq -n "${_jqArgs[@]}" '{assetPair: $assetPair, version: $version, median: $median | tonumber, medianHex: $medianHex, time: $time | tonumber, timeHex: $timeHex, hash: $hash, signature: $signature}'

当我运行上面的脚本时,这是我得到的错误输出。

bash-5.0$ ./test.sh
--arg assetPair BTCUSD --arg version 0.9.1 --arg median 103.96 --arg median0x 000000000000000000000000000000000000000000000005a2bc1d32419c0000 --arg time 1549524531 --arg time0x 000000000000000000000000000000000000000000000000000000005c5bde33 --arg hash 035aa02562167d23f657bb6f1030ba962d476f18a51c5c651b6b4b0 --arg signature cd021f3c3edf1600aafaa81e366cd14543125dd7ec4c1da91765b0e632cfd313a3b8a291153262531e7027163ffe1239ddc9cc42815ddfcf70404a6cb5f2d71b --arg Bitfinex 104.61 --arg Poloniex 102.88 --arg Coinbase 103.96
jq: Unknown option --arg assetPair BTCUSD

我已经尝试在jqArgs中将BTCUSD分配给assetPair时在BTCUSD周围添加转义的双引号,但这返回了相同的错误。

我期望这样的输出:

{
   "assetPair": "BTCUSD",
   "version": "0.9.1",
   "median": 103.96,
   "medianHex: "000000000000000000000000000000000000000000000005a2bc1d32419c0000",
   "time": 1549524531,
   "timeHex": "000000000000000000000000000000000000000000000000000000005c5bde33",
   "hash": "db035aa02562167d23f657bb6f1030ba962d476f18a51c5c651b6b4b0",
   "signature": "51cd021f3c3edf1600aafaa81e366cd14543125dd7ec4c1da91765b0e632cfd313a3b8a291153262531e7027163ffe1239ddc9cc42815ddfcf70404a6cb5f2d71b",
   "sources": {
      "Bitfinex": "104.61",
      "Coinbase: "103.96",
      "Poloniex": "102.88"
   }
}

以下调整足以使您的脚本正常运行到完成:

  1. 修正名称不一致

    中值0x =>中值十六进制时间0x => timeHex

  2. 更改调用(删除引号)

    jq -n $ {_ jqArgs [@]} ...

处理bash数组

关于bash数组,在您的情况下,我建议您分别读取它们,例如,使用以下所示的技术:

jq -nc --argjson vs "$(printf '%s\n' "${validSources[@]}" | jq -nR '[inputs]')" '$vs'

使用您的数据,将产生:

["Bitfinex","Poloniex","Coinbase"]

构造.sources

然后,您可以使用$ vs和类似地获得的$ vp将所需的对象构造为.sources ,例如:

[$vs, $vp] | transpose | map({(.[0]): .[1]}) | add

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM