連続して複数のカールを試してみてください

連続して複数のカールを試してみてください
#!/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行に減らす方法はありますか?

物事をダウンロードするためにあまりにも多くの変数を定義するのは良いことではありません。

ベストアンサー1

裏地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)残りの正規表現では、「Dot Match Newline」を有効にします。情報:インライン修飾子
    • .*?貪欲なマッチング。
  2. sed -rn '$,$s_.*"(.*)">.*<td>(.*)</td></tr>.*_\1squid-\2.tar.gz_p'
    • ここを作ってください:v3/3.5/squid-3.5.26.tar.gz
    • $,$最後の行のみが処理されます。
    • スラッシュとタグがあるsため、ubstituteコマンドでスラッシュの代わりにアンダースコアを使用しています。例: 代わりに</tr></td>s_foo_bar_s/foo/bar/
  3. xargs -I{} wget "${URL_1}"{}
    • wgetパスxargshttp://www.squid-cache.org/Versions/接続されている2つの部分をに渡します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')"

おすすめ記事