How do I capture a MySQL result set in a bash array?
With the --batch
option, mysql
should output the result one record on a line, and columns separated by tabs. You can read the lines to an array with Bash's mapfile
and process substitution, or command substitution and array assignment:
mapfile results < <( mysql --batch ... < query.sql )
or
set -f # disable globbing
IFS=$'\n' # set field separator to NL (only)
results=( $(mysql --batch ... ) )
(Note that IFS
stays modified and globbing disabled after this.)
Then, if you want to split the columns of a row to some variables:
IFS=$'\t' read -r col1 col2 col2 ... <<< "${results[0]}"
Your assignment
linesIN=`cat /tmp/query.csv | sed 's/\t/,/g'`
is not an array assignment (it's missing the parenthesis). It just assigns the output of the command substitution to a regular string variable. (Any newlines will be embedded there, but it'll still be a single string.) ${#linesIN[@]}
still works since in Bash/ksh single-element arrays and scalar variables act the same.
Another way to do it would be to pipe the output of the command to a while loop. Note you want to include the -N or the results include the column name.
#!/bin/bash
#Script to read output from a mysql command line by line
mysql -uroot -p example -N -e "select column from table" | while IFS= read -r loop
do
echo "$loop"
done
And if you just want a count, you'd do a select count(columnName)
and print out the results.