Estou usando shell bash no CentOS 7. Desejo executar uma consulta MySQL a partir de um script de shell e iterar em cada linha de resultados. Se houvesse 4 linhas retornadas, pensei que poderia capturar as quatro linhas em uma matriz como esta:
query="select p.id, p.ebook_id, es.id FROM ...";
echo "$query" > /tmp/query.sql
mysql -u user --password=pass db_id < /tmp/query.sql > /tmp/query.csv
linesIN=`cat /tmp/query.csv | sed 's/\t/,/g'`
arraylength=${#linesIN[@]}
echo $arraylength
No entanto, $arraylength
sempre produz 1
, embora eu possa ver várias linhas de resultado retornadas. Como posso modificar o acima para criar corretamente uma matriz de resultados onde cada elemento na matriz representa uma linha do conjunto de resultados?
Com a
--batch
opção ,mysql
deve sair o resultado um registro em uma linha, e colunas separadas por tabulações. Você pode ler as linhas para uma matriz com Bashmapfile
e substituição de processo, ou substituição de comando e atribuição de matriz:ou
(Observe que
IFS
permanece modificado e globbing desabilitado depois disso.)Então, se você quiser dividir as colunas de uma linha para algumas variáveis:
Sua tarefa
não é uma atribuição de matriz (está faltando o parêntese). Ele apenas atribui a saída da substituição do comando a uma variável de string regular. (Qualquer nova linha será incorporada lá, mas ainda será uma única string.)
${#linesIN[@]}
ainda funciona, pois em Bash/ksh matrizes de elemento único e variáveis escalares agem da mesma forma.Outra maneira de fazer isso seria canalizar a saída do comando para um loop while. Observe que você deseja incluir o -N ou os resultados incluem o nome da coluna.
E se você quiser apenas uma contagem, faça uma
select count(columnName)
e imprima os resultados.Se você quiser o número de linhas de um arquivo, que será igual ao número de linhas retornadas da consulta, basta usar
wc
para contar o número de linhas do arquivo