首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用shell脚本中数量未知的参数使用jq?

用shell脚本中数量未知的参数使用jq?
EN

Stack Overflow用户
提问于 2022-03-09 13:38:24
回答 2查看 300关注 0票数 0

今天我要第一次和jq一起工作了。我试过用任何一种肮脏的方法来使这件事成功。我们开始谈正事吧:

我正试图为一些用例进一步开发用于Unifi控制器的相当简单的API:https://dl.ui.com/unifi/6.0.41/unifi_sh_api

下面是一些模拟数据(真正的json数据是数千行):

代码语言:javascript
复制
{
  "meta": {
    "rc": "ok"
  },
  "data": [
    {
      "_id": "61a0da77f730e404af0edc3c",
      "ip": "10.19.31.120",
      "mac": "ff:ec:ff:89:ff:58",
      "name": "Test-Accesspoint"
    }
  ]
}

这是我的advancedapi.sh

代码语言:javascript
复制
#!/bin/bash
source unifiapi.sh
unifi_login 1>dev/null

if [ "$1" ];
then
command=$1
shift
else
echo "Please enter command"
exit
fi
#jq -r '.data[] | "\(.name),\(.mac)"'

assembleKeys(){
c="0"
seperator=";"
keys=$(for i in "$@"
do
        c=$(expr $c + 1)
        if [ $c -gt 1 ];
        then
                echo -n "${seperator}\(.${i})"
        else
                echo -n "\(.${i})"
        fi
done
echo)
}

assembleJQ(){
c=0
jq=$(echo -en 'jq -r -j \x27.data[] | '
for i in "$@"
do
        if [ "$c" != "0" ];
        then
        echo -en ",\x22 \x22,"
        fi
c=1
echo -en ".$i"
done
echo -en ",\x22\\\n\x22\x27")
echo "$jq"
}


getDeviceKeys(){
assembleJQ "$@"



#unifi_list_devices | jq -r '.data[]' | jq -r "${keys}"
#export keys=mac
#export second=name
#unifi_list_devices | jq -r -j --arg KEYS "$keys" --arg SECOND "$second" '.data[] | .[$KEYS]," ",.[$SECOND],"\n"'

unifi_list_devices | $jq
#unifi_list_devices | jq -r -j '.data[] | .mac," ",.name,"\n"'
}

"$command" $@

用户应该能够用他们想要的多少参数从API调用任何函数。所以基本上这个:

代码语言:javascript
复制
#export keys=mac
#export second=name
#unifi_list_devices | jq -r -j --arg KEYS "$keys" --arg SECOND "$second" '.data[] | .[$KEYS]," ",.[$SECOND],"\n"'

这是可行的,但只有有限的几个参数。我想把$@传给jq。

我试图通过呼叫获取设备的名称和mac地址:

代码语言:javascript
复制
./advancedapi.sh getDeviceKeys mac name

这应该返回设备的mac地址和名称。但它只给了我这个:

代码语言:javascript
复制
jq -r -j '.data[] | .mac," ",.name,"\n"'
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
'.data[]
jq: 1 compile error

最上面的行是jq命令,它在手动调用时工作得非常好。

assembleKeys函数是我试图生成如下所示的字符串:

代码语言:javascript
复制
jq -r '.data[] | "\(.name),\(.mac)"'

谁能给我解释一下,最好是深入一点,怎么做?我快疯了!

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-09 20:04:03

我想把$@传给jq。

实际上有很多方法可以做到这一点,但最简单的方法可能是使用--args命令行选项,如下所示:

档案:检查

代码语言:javascript
复制
#/bin/bash
echo "${@}"
jq -n '$ARGS.positional' --args "${@}" 

示例运行:

代码语言:javascript
复制
./check 1 2 3
1 2 3
[
  "1",
  "2",
  "3"
]

投影

这里有一个例子,可能更接近你要找的东西。使用示例JSON:

文件: check2

代码语言:javascript
复制
#/bin/bash
jq -r '
  def project($array):
    . as $in | reduce $array[] as $k ([]; . + [$in[$k]]);
  $ARGS.positional,
  (.data[] | project($ARGS.positional))
  | @csv
' input.json --args "${@}" 
代码语言:javascript
复制
./check2 name mac
"name","mac"
"Test-Accesspoint","ff:ec:ff:89:ff:58"
票数 2
EN

Stack Overflow用户

发布于 2022-03-09 14:43:09

在json (红色突出显示的逗号)中有错误(不需要逗号)

代码语言:javascript
复制
$
$ cat j.json | jq -r '.data[] | "\(.name)█\(.mac)█\(.ip)█\(._id)"'
Test-Accesspoint█ff:ec:ff:89:ff:58█10.19.31.120█61a0da77f730e404af0edc3c
$ cat j.json
{
  "meta": {
    "rc": "ok"
  },
  "data": [
    {
      "_id": "61a0da77f730e404af0edc3c",
      "ip": "10.19.31.120",
      "mac": "ff:ec:ff:89:ff:58",
      "name": "Test-Accesspoint"
    }
  ]
}
$

如果api给出了这个json,那么在将它导入jq (可能是用sed或类似的东西)之前,您可能应该编辑它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71410229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档