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=}"
}
Então, eu não testei o que foi dito acima, mas aparentemente curl
para garantir sua saída, em vez de depender dos analisadores em grande grau.
Como escrito curl
deve imprimir em seu curl
somente o código de retorno http de sua consulta e o URL que você o alimenta - o que não precisa ser uma variável, mas está acima de legibilidade e de demonstrar que pode ser.
So the next thing we do is ${
strip%%*}
from the %%
tail of that output as far forward as we *can until we encounter the first [
character]
in the string that !
isn't a 0-9
number.
Then we [
test]
the resulting numeric string against our desired http return $code.
&&If
they -equal
we ${strip##*}
from the ##head
of our stored $_curl
output as far forward as we can up to and including the last ~tilde
it contains and assign=
the results to $ppa
.
Then we assign= $ppa
again to:
The string "ppa:" plus:
${ppa's}
previous value ${less%%*}
the first /forward-slash
it contains and everything thereafter plus:
Only what remains of $_curl
after ${removing##*}
from its ##head
everything up to and including the string "namefilter="
Isso oferece algumas vantagens sobre as outras soluções.
As already explained, curl
guarantees its standard output only to be the short string "$code $url"
, but, as written, it also sends the html results to your terminal for debugging on standard error. Its results are not consumed by a parsing program.
Only two applications are involved here: curl
and whatever POSIX-compatible shell in which you invoke it.
The results are explicitly tested in the current shell environment and are not consumed on the far side of a subshelled pipe nor are they the result of a regular expression.
Tem uma desvantagem:
It depends upon the "namefilter=$RESULT"
being the tail of your URL string. It is possible to handle using the same mechanics applied here if it is not, but it will likely require at least one more shell command. sed
and awk
both offer more powerful string searches than simple ${parameter##expansion}
globs ever could.
MAS porque ajustamos a saída de stdout
para o nosso propósito, em primeiro lugar, você não precisa de pesquisas de string poderosas. Contanto que o código http desejado seja retornado para curl
E sua saída deve ser curl
, então não vejo como "namefilter=$desired_string"
pode sempre igualar qualquer coisa que não deveria.
Se você deve aceitar vários códigos de retorno http, seu $ppa
test [
deve ser assim:
codes="$code1 $code2 $code3"
...
[ "${codes#*"${_curl%%[!0-9]*}"} -ne "$codes" ] && ppa=...