#!/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}"{}
grep -Pzo '(?s)Stable Versions.*?langpack'
-P
将模式解释为与 Perl 兼容的正则表达式。-z
多行搜索所需的选项。-o
仅打印匹配行的匹配(非空)部分。(?s)
对于正则表达式的其余部分,打开“点匹配换行符”。信息:内联修饰符。.*?
非贪婪匹配。
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/
- 在这里构建这一部分:
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 "$(....)"