Extensible variables in a shell script

I have a query that I need for a loop.

query="select '$dbserver' as server;"

while read dbserver username password dbname type
do
mysql -h$dbserver -u$username -p$password $dbname -Be"$query" >> /home/develop/myreport.csv
done < $dblist

The next line expands correctly.

mysql -h$dbserver -u$username -p$password $dbname -Be"select '$dbserver' as server;" >> /home/develop/myreport.csv

But when I take out the request and save it in a variable, as shown above, it stops working as expected and gives an empty value for "dbserver". The line above in the loop does not work. How to fix this problem?

+3
source share
3 answers

If you want the '$dbserver'query to expand inside the loop, you probably write:

while read dbserver username password dbname type
do
    query="select '$dbserver' as server;"
    mysql -h$dbserver -u$username -p$password $dbname -Be"$query"
done < $dblist  > /home/develop/myreport.csv

As originally written, the query string is evaluated before any value is assigned $dbserver, so you got an empty string in the output.

, - done, ( , ).


, , -, , eval. , $dbserver , . ( SQL), eval:

query='select \"$dbserver\" as server;'
echo "$query"
while read dbserver username password dbname type
do
    echo 1: "$query"
    eval echo 2: "$query"
    qval=$(eval echo "$query")
    echo mysql -h$dbserver -u$username -p$password $dbname -Be"$qval"
done

, """ "'\''":

query='select \'\''$dbserver\'\'' as server;'
echo "$query"
while read dbserver username password dbname type
do
    echo 1: "$query"
    eval echo 2: "$query"
    qval=$(eval echo "$query")
    echo mysql -h$dbserver -u$username -p$password $dbname -Be"$qval"
done

, , , - , ! [... ...] !

:

  • .
  • escape-.
  • , - .
  • 4 - '\''.
  • .
  • , .
  • .
  • , .
  • $dbserver - .
  • , .
  • .

eval . ; $dbserver. .

eval , . MySQL, , . , eval. , , :

query='select \'\''$dbserver\'\'' as server, \`ls\` as column;'
echo "$query"
while read dbserver username password dbname type
do
    echo 1: "$query"
    eval echo 2: "$query"
    qval=$(eval echo "$query")
    echo mysql -h$dbserver -u$username -p$password $dbname -Be"$qval"
done

, .

+2

. (.. )

0
while read -r dbserver username password dbname type
do
 query="select '$dbserver' as server;"
 mysql -h${dbserver} -u${username} -p${password} ${dbname} -Be"${query}" >> /home/develop/myreport.csv
done < $dblist
0
source

Source: https://habr.com/ru/post/1761659/


All Articles