我需要一个变量来存储从数据库检索到的结果。目前这就是我的基本尝试,但并没有成功。
myvariable=$(mysql database -u $user -p $password | SELECT A, B, C FROM table_a)
正如你所看到的,我对bash命令的理解并不是很好。
myvar=$(mysql mydatabase -u $user -p$password -se "SELECT a, b, c FROM table_a")
我对MySQL命令行界面不是很了解,但假设你只需要关于bash的帮助,应该尝试交换命令的顺序,如下所示:
myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p$password)
你可以使用echo将字符串输出到MySQL中。或者,你也可以更高级地使用一些新的bash特性(比如here string)。
你可以使用echo将字符串输出到MySQL中。或者,你也可以更高级地使用一些新的bash特性(比如here string)。
myvariable=$(mysql database -u $user -p$password<<<"SELECT A, B, C FROM table_a")
如果使用足够新的bash版本,可以避免使用echo并得到相同的结果。
请注意,-p$password 不是打字错误,而是MySQL要求通过命令行输入密码的方式(选项和值之间没有空格)。
请注意,myvariable将包含MySQL在标准输出上输出的所有内容(通常除了错误消息以外的所有内容),包括任何列标题、ASCII艺术框架等内容,这可能不是您想要的。
编辑:
如已指出,MySQL似乎有一个-e参数,我一定会选择那个。
-p$password
选项。POSIX标准允许,尽管不鼓励,可选的选项属性。与强制选项属性不同,后者在选项之后用<blank>字符分隔显示(例如-u $user
),可选的选项参数包含在与选项相同的参数字符串中(即没有空格)。如果您觉得这种语法令人困惑(我也是),您可以使用GNU长参数语法:--password=$password
。无论如何,我还建议使用my.cnf文件,因为这已经被建议过了。 - David你需要反转管道并打印查询结果,像这样:
myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql db -u $user -p $password)
另一种选择是仅使用mysql客户端,像这样:
myvariable=$(mysql db -u $user -p $password -se "SELECT A, B, C FROM table_a")
需要使用-s
选项来避免生成ASCII图案。
BASH并不是最适合处理这种场景的语言,特别是在处理字符串、拆分SQL结果等方面。你需要花费很多精力去做那些在Perl、Python或PHP中非常简单的事情。
例如,如何将A、B和C分别存储到它们自己的变量中?这肯定是可行的,但如果你不了解管道和echo(非常基础的shell内容),那么这对你来说将不是一项容易的任务,所以如果可能的话,我建议使用更适合的语言。
要逐行读取数据并存入 Bash 数组中,可以使用以下方法:
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)
或者将它们分配给单独的变量:
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)
syntax error near unexpected token
<'
cut.sh: line 26: done < <
- thevoipmanecho ... | mysql ... | while read -a row; do ...; done
。请记住,while体位于子shell中,不会影响其周围的shell。 - falstro如果你想在bash中使用单个值,请使用:
companyid=$(mysql --user=$Username --password=$Password --database=$Database -s --execute="select CompanyID from mytable limit 1;"|cut -f1)
echo "$companyid"
--skip-column-names (-N)
,而不是| cut -f1
。 - jon其他方法:
您的脚本:
#!/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
myvariable=$(mysql database -u $user -p$password | SELECT A, B, C FROM table_a)
-p
后面没有空格。这很琐碎,但如果没有空格就不起作用。如果您有特定的数据库名称和要执行查询的主机,请使用以下查询:
outputofquery=$(mysql -u"$dbusername" -p"$dbpassword" -h"$dbhostname" -e "SELECT A, B, C FROM table_a;" $dbname)
因此,要在Linux上运行MySQL查询,您需要安装MySQL客户端。
我在这里说两句:
myvariable=$(mysql database -u $user -p$password -sse "SELECT A, B, C FROM table_a" 2>&1 \
| grep -v "Using a password")
移除列名和烦人的(但必要的)密码警告。感谢@Dominic Bartl和John提供此答案。
另一个例子是当表名或数据库包含不支持的字符,例如空格或“-”时
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;"`