script bash: seleccione de la base de datos en variable

Necesito una variable para mantener los resultados recuperados de la base de datos. Hasta ahora, esto es básicamente lo que estoy intentando sin éxito.

myvariable=$(mysql database -u $user -p $password | SELECT A, B, C FROM table_a) 

Mi comprensión de los comandos de bash no es muy buena como puedes ver.

No sé mucho sobre la interfaz de línea de comandos de MySQL, pero suponiendo que solo necesitas ayuda con los ataques, debes intentar intercambiar los comandos de la siguiente manera:

 myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p$password) 

que echos la cadena en MySQL. O bien, puede ser más elegante y usar algunas características de bash nuevas (la cadena aquí)

 myvariable=$(mysql database -u $user -p$password<<<"SELECT A, B, C FROM table_a") 

dando como resultado lo mismo (suponiendo que esté utilizando una versión bash bastante reciente), sin involucrar eco.

Tenga en cuenta que la contraseña -p $ no es un error tipográfico, sino que es la forma en que MySQL espera que las contraseñas se ingresen a través de la línea de comando (sin espacio entre la opción y el valor).

Tenga en cuenta que myvariable contendrá todo lo que MySQL genera en salida estándar (generalmente todo menos mensajes de error), incluidos todos y cada uno de los encabezados de columna, cuadros ASCII artísticos, etc., que pueden ser o no lo que usted desea.

EDITAR:
Como se ha notado, parece haber un parámetro -e para MySQL, yo iría por ese, definitivamente.

Una forma más directa sería:

 myvar=$(mysql mydatabase -u $user -p$password -se "SELECT a, b, c FROM table_a") 

Para leer los datos línea por línea en una matriz Bash, puede hacer esto:

 while read -a row do echo "..${row[0]}..${row[1]}..${row[2]}.." done < <(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p $password) 

O en variables individuales:

 while read abc do echo "..${a}..${b}..${c}.." done < <(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p $password) 

Usted tiene la tubería al revés y necesita repetir la consulta, así:

 myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql db -u $user -p $password) 

Otra alternativa es usar solo el cliente mysql, como este

 myvariable=$(mysql db -u $user -p $password -se "SELECT A, B, C FROM table_a") 

( -s es necesario para evitar el ASCII-art)

Ahora, BASH no es el lenguaje más apropiado para manejar este tipo de escenarios, especialmente el manejo de cadenas y la división de resultados de SQL y similares. Tienes que trabajar mucho para obtener cosas que serían muy, muy simples en Perl, Python o PHP.

Por ejemplo, ¿cómo obtendrás cada uno de A, B y C en su propia variable? Es ciertamente factible, pero si no entiendes las tuberías y el eco (material de shell muy básico), no será una tarea fácil para ti, así que si es posible utilizaría un lenguaje más adecuado.

Si quiere usar un solo valor en bash use:

  companyid=$(mysql --user=$Username --password=$Password --database=$Database -s --execute="select CompanyID from mytable limit 1;"|cut -f1) echo "$companyid" 
 myvariable=$(mysql database -u $user -p$password | SELECT A, B, C FROM table_a) 

sin el espacio en blanco después de -p . Es trivial, pero sin no funciona.

Si tiene un nombre de base de datos particular y un host en el que desea que se ejecute la consulta, siga la consulta siguiente:

outputofquery = $ (mysql -u “$ dbusername” -p “$ dbpassword” -h “$ dbhostname” -e “SELECCIONE A, B, C FROM table_a;” $ dbname)

Entonces, para ejecutar las consultas mysql necesitas instalar mysql client en linux

 myvariable=$(mysql -u user -p'password' -s -N < 

Otro ejemplo cuando el nombre o la base de datos de la tabla contiene caracteres no admitidos, como un espacio, o ‘-‘

 db='data-base' db_d='' db_d+='`' db_d+=$db db_d+='`' myvariable=`mysql --user=$user --password=$password -e "SELECT A, B, C FROM $db_d.table_a;"`