[英]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"
}
}
以下调整足以使您的脚本正常运行到完成:
修正名称不一致
中值0x =>中值十六进制时间0x => timeHex
更改调用(删除引号)
jq -n $ {_ jqArgs [@]} ...
关于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.