curl saída do comando em uma variável [duplicata]

0

Estou conectando-me ao banco de dados mySQL usando um script de shell. Depois de se conectar ao banco de dados mySQL, eu executo uma consulta. A consulta me fornece 300.000 URLs como resultado.

Para cada um dos 300.000 URLs, preciso verificar se os URLs realmente existem e se preciso atualizar a tabela em que a URL está marcada para sua existência.

Eu planejei usar o comando curl. Eu estou dando o comando como abaixo.

curl -s --head http://myurl/ | head -n 1 | grep "HTTP/1.[01] [23].."

Se eu der o comando no meu shell, estou recebendo a resposta (como 301, 200 etc). No entanto, eu preciso disso em uma variável para que eu possa usá-lo para alguns fins de manipulação. Por exemplo, como abaixo.

$var = curl -s --head http://myurl/ | head -n 1 | grep "HTTP/1.[01] [23].."
echo $var;
if ($var == "some value")
{ 
    do something;
}
else
{
    do some other thing;
}
    
por Ramesh 29.01.2014 / 21:50

2 respostas

2

Para capturar o resultado de um comando em uma variável, você pode usar backticks ( '' ) ou, melhor, $(command) . No seu caso, isso seria:

var=$(curl -s --head http://myurl/ | head -n 1 | grep "HTTP/1.[01] [23]..")
echo "$var";
if [ "$var" == "some value" ]; then    
    do something;    
else
    do some other thing;
fi
    
por 29.01.2014 / 21:53
4

Extrair todos os 300.000 URLs de uma só vez não é o ideal. Você pode achar mais útil extrair um pequeno número de URLs, verificá-las e extrair URLs diferentes.

Digamos que você atribua status 0 a URLs não verificados. Você quer mudar este status para 200, 301, 404, 403, 401 e assim por diante e assim por diante.

Digamos que cada linha tenha um ID exclusivo, o que torna as coisas mais rápidas.

#!/bin/sh

NUM=10
RESULTS=/tmp/results.$$.$RANDOM.txt

# Select some rows, selecting ID and URL

# The URL may contain spaces or single quotes.
# I wouldn't trust double quotes; a  ' grep -v '"'  ' piped between
# the mysql --silent and the while could be advisable in this case.

echo "SELECT id, url FROM mytable WHERE status = 0 LIMIT $NUM;" \
    | mysql --silent mydatabase \
    | while [ -n "$ID"  ]; do
    read ID URL
    if [ -n "$ID" ]; then
            # Extract HTTP result code
        CODE=' curl -s --head "$URL" | head -n 1 \
                   | grep "^HTTP/[01]\.[0-9] [1-9][0-9]*" \
                   | cut -f2 -d" " '

            # If there is a code
        if [ -n "$CODE" ]; then
            if [ "$CODE" == "200" ]; then
                echo "200"
            else
                echo "Not 200"
            fi
                    # Prepare update
            echo "UPDATE mytable SET status=$CODE WHERE id=$ID;" >> $RESULTS
            else
                 # We might update this ID to a new status in order not to
                 # extract it again.
                 echo "UPDATE mytable SET status=666 WHERE id=$ID;" >> $RESULTS
        fi
    fi
done

# update database
mysql mydatabase < $RESULTS
# Remove temporary file
rm $RESULTS
    
por 29.01.2014 / 22:09

Tags