连续打多个弯举动作

连续打多个弯举动作
#!/usr/bin/env bash

URL_1=http://www.squid-cache.org/Versions/

URL_2=$(curl "$URL_1" | sed -n '/Stable Versions/{p; :loop n; p; /rolling/Iq; b loop}' | grep -i rolling | cut -d \" -f 2)

URL_3=$(curl "$URL_1""$URL_2" | sed -n '/Latest/{p; :loop n; p; /.gz/q; b loop}' | grep .gz | cut -d \" -f 2)

wget "$URL_1""$URL_2""$URL_3"

我可以以任何方式将上面的代码缩短为一行代码吗?

为了下载东西而定义这么多变量是不好的。

答案1

一件内衬,如何订购:)

URL_1变量用于提高可读性。没有必要。

#!/bin/bash

URL_1=http://www.squid-cache.org/Versions/

curl "$URL_1" | 
grep -Pzo '(?s)Stable Versions.*?langpack' | 
sed -rn '$,$s_.*"(.*)">.*<td>(.*)</td></tr>.*_\1squid-\2.tar.gz_p' | 
xargs -I{} wget "${URL_1}"{}
  1. grep -Pzo '(?s)Stable Versions.*?langpack'
    • -P将模式解释为与 Perl 兼容的正则表达式。
    • -z多行搜索所需的选项。
    • -o仅打印匹配行的匹配(非空)部分。
    • (?s)对于正则表达式的其余部分,打开“点匹配换行符”。信息:内联修饰符
    • .*?非贪婪匹配。
  2. sed -rn '$,$s_.*"(.*)">.*<td>(.*)</td></tr>.*_\1squid-\2.tar.gz_p'
    • 在这里构建这一部分:v3/3.5/squid-3.5.26.tar.gz
    • $,$仅处理最后一行。
    • 我在 ubstitute 命令中使用下划线而不是斜杠s,因为</tr></td>标签中存在斜杠。示例:s_foo_bar_代替s/foo/bar/
  3. xargs -I{} wget "${URL_1}"{}
    • wget通过xargs:http://www.squid-cache.org/Versions/和 传递两个连接部分到v3/3.5/squid-3.5.26.tar.gz

编辑 - 没有 xargs 的版本(这里不需要):

#!/bin/bash

URL_1=http://www.squid-cache.org/Versions/

wget "${URL_1}$(curl "$URL_1" |
grep -Pzo '(?s)Stable Versions.*?langpack' |
sed -rn '$,$s_.*"(.*)">.*<td>(.*)</td></tr>.*_\1squid-\2.tar.gz_p')"

答案2

一句单行话,用的lynx是 han curl

$ lynx -dump -listonly -nonumbers \
  "$(lynx -dump -listonly -nonumbers  http://www.squid-cache.org/Versions/ | 
     awk '/^http:.*\/Versions\/v/ {print ; exit}')" |
  awk '/^http:.*\.tar.gz/ {print; exit}'
http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.26.tar.gz

为了使它真正下载最新稳定版本的鱿鱼源代码,将整个包起来wget "$(....)"

相关内容