【问题标题】:Convert values from array in json object using bash shell使用 bash shell 从 json 对象中的数组转换值
【发布时间】:2018-02-26 15:04:25
【问题描述】:

我对 shell 完全陌生......让我说出正确的用例。 用例:- 我在我的 shell 脚本中编写了两个 get 方法,当用户调用该脚本时,我将使用 for 循环对许多 id 执行一些操作。如下所示

test_get1(){

value1=//performing some operation and storing it
value2=//performing some operation and storing it

//below line I am converting the o/p of value1 and value2 in json

value=$JQ_TOOL -n --arg key1 "$value1" --arg key2 "$value2" '{"key1":"\($value1)","key2":"\($value2)"}'

}

test_get2(){
arr=(1,2,3)
local arr_values=()
for value in arr
do 
// Calling test_get1 for each iteraion of this loop, like below
val=$(test_get1 $value)
//below line will store the values in array
arr_values+=("$val")
done 
}

当我为上述 arr_values 做回显时,我得到以下输出 输出。

arr_values={
    "key1":"value1",
    "key2":"value2"
    }
    {
    "key1":"value1",
    "key2":"value2"
    }

我想把上面的值转换成下面这样的json格式。

json_value=[
{
"key1":"value1",
"key2":"value2"
},
{
"key1":"value1",
"key2":"value2"
}
]

我尝试用 JQ 来做,但无法得到正确的结果。

【问题讨论】:

  • 发布实际有效的输入json结构
  • 您的输入 arr_values 甚至不是有效的 JSON
  • @RomanPerekhrest 我已经更新了问题
  • @umesh、LS=/usr/bin/ls 和类似的东西是一种反模式——这种不好的做法被人们复制了他们在为 1970 年代编写的脚本中看到的东西而没有缓存 PATH 查找。这里绝对没有任何价值——如果你需要覆盖jq,你最好定义一个包装函数;使用变量只会降低可读性,并且(如果该变量包含绝对路径)会降低跨机器的可移植性。
  • (...而如果您的目标是在 crond 的默认 PATH 不包含本地 jq 二进制文件的位置的系统上从 cron 作业运行,那么正确的做法是 在您的 crontab 文件中定义一个 PATH;即在规范之前放置一行 PATH=/bin:/usr/bin:/usr/local/bin

标签: bash shell unix echo jq


【解决方案1】:

使用 slurp 选项:

jq -s . in.json > out.json

in.json

{
  "key1": "value1",
  "key2": "value2"
}
{
  "key1": "value1",
  "key2": "value2"
}

out.json

[
  {
    "key1": "value1",
    "key2": "value2"
  }
]
[
  {
    "key1": "value1",
    "key2": "value2"
  }
]

【讨论】:

    【解决方案2】:

    1) 您现有的 "value=" 行可以简化为:

    value=$(jq -n --arg key1 "$value1" --arg key2 "$value2" '\
       {key1: $value1, key2: $value2}')
    

    因为--arg 总是将提供的值解释为字符串,并且因为 jq 表达式不需要遵循 JSON 的所有规则。

    2) 在您的脚本中,arr_value 是 JSON 值的 bash 数组。要将其转换为 JSON 数组,您应该能够使用如下咒语:

    for r in "${a[@]}" ; do printf "%s" "$r" ; done | jq -s .
    

    3) 几乎肯定有更好的方法来实现您的最终目标。如果您考虑只调用一次 jq 可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多