bash脚本,用于卷曲数组中的所有url



我有一个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

最新更新