我有一个url数组,比如(来自jq调用(:
["https://example.com/text.txt", "https://example.com/text2.txt", "https://example.com/text3.txt"]
如何循环浏览并将每个url卷曲到当前文件夹中?
编辑:
for link in $(jq -c 'xxxx' file.txt); do
echo "$link"
done
如果您正在调用一个命令,要获得链接列表,您可以简单地迭代该命令的结果,比如:
for link in "$(jq <args...>)"; do
# do something here
done
或:
while read -r link; do
# do something here
done <<< $(jq <args...>)
由于JSON数组是"从jq呼叫中出来";,只需让jq使用.[]
和-r
选项将其输出为原始文本url的列表,然后使用curl
将该列表管道传输到xargs
中。
jq -r '… | .[]' | xargs -I{} curl -O {}
如果您无法修改原始的jq过滤器,请在管道中插入另一个对jq的调用:
… | jq -r '.[]' | xargs -I{} curl -O {}
将以下内容添加到jq代码的末尾,并通过管道连接到sh
来运行它:
jq -r '[ "curl", .[] ] | @sh' | sh
@sh
过滤器正确逃离外壳的输出单个shell命令是一个数组/列表,由空格
cmd opts ... args ...
分隔,curl可以接受多个URL参数。因此,在jq中,您可以将
curl
命令(和任何选项(作为数组中的额外元素,并通过@sh
进行筛选,以生成一个正确引用的shell命令。请注意,JSON数组中元素的顺序是保留的,这就是我们想要的——首先是
curl
。您可以在没有管道的情况下运行jq,以检查将执行的内容:
例如:
echo '["https://example.com/text.txt", "https://example.com/text2.txt", "https://example.com/text3.txt"]' |
jq -r '[ "curl", .[] ] | @sh'
应生产:
'curl' 'https://example.com/text.txt' 'https://example.com/text2.txt' 'https://example.com/text3.txt'
curl
周围的引号很好。该输出可以通过管道(在shell中(传输到sh
以执行。
这将在当前目录中创建3个文件:
echo '["https://example.com/text.txt", "https://example.com/text2.txt", "https://example.com/text3.txt"]' | jq '.[]' | xargs -n 1 curl -O