Conjunto de resultados da consulta Mysql no script bash

4

Estou usando o script bash para conectar-me ao banco de dados mysql e executar uma consulta.

Eu uso o script abaixo para conectar-me ao banco de dados e executar a consulta.

#!/bin/bash
Total_Results=$(mysql -h server-name -P 3306 -u username-ppassword -D dbname<<<"select URL  from Experiment where URL_Exists = 1");
for URL in "$Total_Results";
do
echo $URL
var=$(curl -s --head $URL | head -n 1 | grep "HTTP/1.[01] [23]..")
echo "$var"
if [ -z "$var" ]
then
echo "Ok we do not have a valid link and the value needs to be updated as -1 here"
else
echo "we will update the value as 1 from here"
fi
done

O problema é que o conjunto de resultados é considerado como um resultado inteiro e estou ficando dentro do loop else apenas uma vez (vamos atualizar o valor como 1 daqui é impresso apenas uma vez). Tenho 2500 URLs válidos e espero 2500 ecos de we will update the value as 1 from here .

Como posso processar cada linha como um único resultado da consulta mySQL?

    
por Ramesh 29.01.2014 / 23:03

2 respostas

4

mysql parece gerar os resultados para uma variável shell em uma única linha. Uma maneira de contornar isso é gravar o conteúdo em um arquivo temporário e processá-lo em um loop while.

EDITAR No meu sistema, o IFS="\ n" antes do comando mysql (quando os resultados são atribuídos a uma variável shell) fornece a saída correta de várias linhas. por exemplo.

 IFS="\n"
 Total_results=$(mysql.....)

=============== Fim do processo de edição ==========================

#!/bin/bash
mysql --silent -h server-name -P 3306 -u username-ppassword -D dbname<<<"select URL  from Experiment where URL_Exists = 1" > tmp_results

while read URL
do 
   echo $URL
   var=$(curl -s --head $URL | head -n 1 | grep "HTTP/1.[01] [23]..")
   echo "$var"
   if [ -z "$var" ]
   then
     echo "Ok we do not have a valid link and the value needs to be updated as -1 here"
   else
     echo "we will update the value as 1 from here"
   fi
done < tmp_results
    
por 29.01.2014 / 23:14
4

Você não precisa de uma variável ou de um arquivo temporário para isso, apenas analise o comando mysql diretamente canalizando para o while loop:

#!/bin/bash
mysql <<<"select URL from Experiment where URL_Exists = 1" |

while IFS='\n' read URL
do
  echo $URL
  var=$(curl -s --head $URL | head -n 1 | grep "HTTP/1.[01] [23]..")
  echo "$var"
  if [ -z "$var" ]
  then
    echo "Ok we do not have a valid link and the value needs to be updated as -1 here"
  else
    echo "we will update the value as 1 from here"
  fi
done
    
por 29.01.2014 / 23:24