
完全な住所を表示する必要があります。カール、ステータスコードが「301」の結果が見つかった場合。
これは私の変数です。
search=$(curl -s --head -w %{http_code} https://launchpad.net/~[a-z]/+archive/pipelight -o /dev/null | sed 's#404##g')
echo $search
301
上記の方法は機能しますが、サイトが存在し、ステータスコードが「301」の場合にのみ表示されます。
私の考えでは
echo $search
https://launchpad.net/~mqchael/+archive/pipelight
修正する
ここに私が必要とするものを説明できる新しい変数があります。この変数を使用すると、Ubuntuで同様のppaを検索してインストールできます。
ppa=$(curl https://launchpad.net/ubuntu/+ppas?name_filter=$packagename | grep '<td><a href="/~' | grep ">$packagename<" )
echo $ppa
例:
ppa=$(curl https://launchpad.net/ubuntu/+ppas?name_filter=Pipelight | grep '<td><a href="/~' | grep ">Pipelight<" )
echo $ppa
<td><a href="/~mqchael/+archive/pipelight">Pipelight</a></td>
ここで問題は抽出できないことですmqchael
(名前は変更可能です)。パイプライトも単なる例です。
変数を適用するときの最終形式です。
ppa:mqchael/pipelight
答え1
これにより、目的のタスクが実行されます。
curl https://launchpad.net/ubuntu/+ppas?name_filter=Pipelight | awk -F/ '/>Pipelight</{print $2}'
説明する:
-F/
フィールド区切り記号をに設定します。/
これは、「/>Pipelight</
一致する唯一の行でコマンドを実行します。したがって、少なくとも公開した例では、行は次のようになります。{}
>Pipelight<
>Pipelight<
<td><a href="/~mqchael/+archive/pipelight">Pipelight</a></td>
awk
したがって、分割によって/
最初のフィールドはになり、<td><a href="
2番目のフィールドはになります~mqchael
。{print $2}
それが印刷される理由です~mqchael
。
チルダ()も削除するには、~
次のコマンドを使用します。
curl https://launchpad.net/ubuntu/+ppas?name_filter=Pipelight |
awk -F/ '/>Pipelight</{print $2}' | sed 's/~//'
答え2
301
どのウェブサイトがステータスコードを返すかを調べようとしているようです。実際には、コマンドの内容をcurl
ファイルに書き込んで実行grep
できます。場所ステータスコードのURLを確認してください301
。この試み。
curl -s --head -w %{http_code} https://launchpad.net/~[a-z]/+archive/pipelight -o
grep 'Location' file1.txt
出力は次のとおりです。
Location: https://launchpad.net/~j/+archive/ppa/pipelight
答え3
code=$desired_HTML_return_code
url="https://launchpad.net/ubuntu/+ppas?name_filter=Pipelight"
_curl=$( curl -o /dev/stderr -sL -w \
"%{http_code} %{url_effective}\\n" "$url" )
[ ${_curl%%[!0-9]*} -eq $code ] && {\
ppa="${_curl##*~}"
ppa="ppa:${ppa%%/*}/${_curl##*namefilter=}"
}
だから上記をテストしていないが、明らかにこの男はい、そして彼はまた様々な説明をしましたcurl
使用できる他の多くのオペランドは言うまでもなく、オペランドも実行しています。しかし、ポイントはあなたが使用することですcurl
パーサに大きく依存するのではなく、それ自体で出力を保証します。
書かれた通りcurl
それで印刷する必要がありますstdout
そのクエリのhttp戻りコードとユーザーが提供したURLのみがあります。変数である必要はありませんが、読みやすさと証明のために上記です。できるはい。
それでは、次に何をすべきか
${
彫刻%%*}
~から%%
尾私たちの生産量と同じ*できる初めて会うまで[
特徴]
文字列として!
いいえㅏ0-9
数字。だから私たちは
[
テスト]
私たちが望むhttp returnに従って結果を返すことによって得られた数値文字列$code.
&&If
それら-equal
私たち${strip##*}
~から##head
私達は救う$_curl
最後を含め、できるだけ早く出力~tilde
それを含みますassign=
結果が届く$ppa
。だから私たちは
assign= $ppa
再:文字列 "ppa:" +:
${ppa's}
以前の値${less%%*}
最初/forward-slash
これには、次のすべての内容が含まれます。残りのもの
$_curl
後ろに${removing##*}
それから##head
文字列までのすべて"namefilter="
これは他の解決策に比べていくつかの利点がある。
すでに説明したように、
curl
標準出力は短い文字列のみを保証します。"$code $url"
しかし、書かれているように、標準エラーのデバッグのためにhtml結果を端末に送信します。結果はいいえパーサーで使用されます。これには2つのアプリケーションのみが含まれます。
curl
そしてそれを呼び出すすべてのPOSIX互換シェル。結果は現在のシェル環境で明示的にテストされ、サブシェルパイプラインのリモートエンドでは使用されず、正規表現の結果でもありません。
欠点があります:
時によって異なります。
"namefilter=$RESULT"
URL 文字列の終わりです。それ以外の場合は、ここに適用されたのと同じメカニズムを使用して処理できますが、少なくとも1つ以上のシェルコマンドが必要になることがあります。sed
そしてawk
どちらも単純検索よりも強力な文字列検索を提供します。${parameter##expansion}
球はかつて可能であった。
しかし、私たちはカスタムメイドをするのでcurl
~のまず、私たちの目的のために強力な文字列検索は必要ありません。必要なhttpコードを返すだけです。curl
そしてあなたの出力は"namefilter=$desired_string"
それではどうすればいいのかわかりません。$ppa
同じではないはずのものと常に同じである可能性があります。
複数のhttp戻りコードを受け入れる必要がある場合[
テスト]
次のようにする必要があります。
codes="$code1 $code2 $code3"
...
[ "${codes#*"${_curl%%[!0-9]*}"} -ne "$codes" ] && ppa=...