作为bash和jq的新手,我试图在bash脚本中使用jq命令从json文件中下载几个url。
我的items.json文件如下所示:
[
{"title" : [bob], "link" :[a.b.c]},
{"title" : [alice], "link" :[d.e.f]},
{"title" : [carol], "link" :[]}
]
我最初做的只是过滤非空链接并将它们放入数组然后下载数组:
#!/bin/bash
lnk=( $(jq -r '.[].link[0] | select (.!=null)' items.json) )
for element in ${lnk[@]}
do
wget $element
done
但是这种方法的问题是所有下载的文件都使用链接作为文件名。
我希望过滤json文件但仍保留带有链接的标题名称,以便我可以在wget命令中重命名该文件。但我不知道我应该在这里使用什么结构。那么如何将标题保留在过滤器中并在之后使用呢?
答案 0 :(得分:0)
您可以使用:
IFS=$'\n' read -d '' -a titles < <(jq -r '.[] | select (.link[0]!=null) | .title[0]' items.json);
IFS=$'\n' read -d '' -a links < <(jq -r '.[] | select (.link[0]!=null) | .link[0]' items.json);
然后你可以迭代数组"${title[@]}"
&amp; ${links[@]}
...
for i in ${!titles[@]}; do
wget -O "${titles[i]}" "${links[@]}"
done
编辑:更容易&amp;更安全的方法:
jq -r '.[] | select (.link[0]!=null) | @sh "wget -O \(.title[0]) \(.link[0])"' items.json | bash
答案 1 :(得分:0)
这是一个bash脚本,演示了如何将jq过滤器的结果读入bash变量。
#!/bin/bash
jq -M -r '
.[]
| select(.link[0]!=null)
| .title[0], .link[0]
' items.json | \
while read -r title; read -r url; do
echo "$title: $url" # replace with wget command
done