Store mysql query output into a shell variable

前端 未结 11 1316
暗喜
暗喜 2020-12-01 06:14

I need a variable to hold results retrieved from the database. So far this is basically what I\'m trying with no success.

myvariable=$(mysql database -u $use         


        
相关标签:
11条回答
  • 2020-12-01 06:33

    If you have particular database name and a host on which you want the query to be executed then follow below query:

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

    So to run the mysql queries you need to install mysql client on linux

    0 讨论(0)
  • 2020-12-01 06:38

    You have the pipe the other way around and you need to echo the query, like this:

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

    Another alternative is to use only the mysql client, like this

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

    (-s is required to avoid the ASCII-art)

    Now, BASH isn't the most appropriate language to handle this type of scenarios, especially handling strings and splitting SQL results and the like. You have to work a lot to get things that would be very, very simple in Perl, Python or PHP.

    For example, how will you get each of A, B and C on their own variable? It's certainly doable, but if you do not understand pipes and echo (very basic shell stuff), it will not be an easy task for you to do, so if at all possible I'd use a better suited language.

    0 讨论(0)
  • 2020-12-01 06:41
    myvariable=$(mysql database -u $user -p$password | SELECT A, B, C FROM table_a)
    

    without the blank space after -p. Its trivial, but without don't work.

    0 讨论(0)
  • 2020-12-01 06:41

    My two cents here:

    myvariable=$(mysql database -u $user -p$password -sse "SELECT A, B, C FROM table_a" 2>&1 \
       | grep -v "Using a password")
    

    Removes both the column names and the annoying (but necessary) password warning. Thanks @Dominic Bartl and John for this answer.

    0 讨论(0)
  • 2020-12-01 06:42

    Other way:

    Your Script:

    #!/bin/sh
    
    # Set these variables
    MyUSER="root"   # DB_USERNAME
    MyPASS="yourPass"   # DB_PASSWORD
    MyHOST="yourHost"    # DB_HOSTNAME
    DB_NAME="dbName"
    CONTAINER="containerName" #if use docker
    
    # Get data
    data=$($MyHOST -u $MyUSER -p$MyPASS $DB_NAME -h $CONTAINER -e "SELECT data1,data2 from table_name LIMIT 1;"  -B --skip-column-names)
    
    # Set data
    data1=$(echo $data | awk '{print $1}')
    data2=$(echo $data | awk '{print $2}')
    
    # Print data
    echo $data1 $data2
    
    0 讨论(0)
  • 2020-12-01 06:44

    To read the data line-by-line into a Bash array you can do this:

    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)
    

    Or into individual variables:

    while read a b c
    do
        echo "..${a}..${b}..${c}.."
    done < <(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p $password)
    
    0 讨论(0)
提交回复
热议问题