新手求助:如何用Shell脚本打印MySQL查询结果并赋值变量?
嘿,作为Shell和MySQL新手,这种摸不着头绪的感觉太正常了!我来一步步帮你拆解问题,从最基础的操作开始,到把查询结果存进变量,再实现你要的打印数据库变更内容的目标。
第一步:先搞定Shell连接MySQL的基础操作
首先得知道怎么在Shell里直接执行MySQL查询,核心命令格式是这样的:
mysql -u 你的用户名 -p'你的密码' -D 目标数据库名 -e "要执行的SQL语句"
举个实际例子,比如你要查test_db数据库里changes表的变更记录:
mysql -u root -p'123456' -D test_db -e "SELECT id, content, created_at FROM changes;"
注意:-p后面的密码要直接跟在后面(如果怕明文泄露,后面我会说更安全的方式),-D用来指定要操作的数据库,-e参数表示要执行后面的SQL语句。
第二步:把查询结果赋值给Shell变量
Shell里要把命令的输出存到变量里,用变量名=$(命令)的语法就行,直接把上面的MySQL命令包进去。如果不想输出表头(只拿纯数据),可以加--skip-column-names参数:
# 把查询结果存到changes变量里 changes=$(mysql -u root -p'123456' -D test_db -e "SELECT id, content, created_at FROM changes ORDER BY id DESC LIMIT 5;" --skip-column-names)
这样$changes变量里就存着你查询到的所有变更数据啦。
第三步:遍历变量内容,格式化打印
如果查询结果是多行多列的,你可以用循环逐行处理,把每一列的数据单独取出来打印。比如下面这个完整的脚本:
#!/bin/bash # 先把数据库配置单独拎出来,方便修改 DB_USER="root" DB_PASS="123456" DB_NAME="test_db" # 查询最近5条变更记录(按ID倒序,最新的在前) changes=$(mysql -u $DB_USER -p$DB_PASS -D $DB_NAME -e "SELECT id, content, created_at FROM changes ORDER BY id DESC LIMIT 5;" --skip-column-names) # 先打印个标题 echo "=== 最近数据库变更内容 ===" # 遍历每一行结果,把列拆分到变量里 # IFS=$'\t' 是因为MySQL默认用制表符分隔列 while IFS=$'\t' read -r id content created_at; do echo "变更ID: $id" echo "变更内容: $content" echo "变更时间: $created_at" echo "-------------------------" done <<< "$changes"
运行这个脚本,就能看到格式化后的变更记录啦!
进阶:更安全的密码处理
直接在脚本里写明文密码不安全,推荐用MySQL的配置文件~/.my.cnf,内容如下:
[client] user=root password=123456
然后给这个文件设置严格的权限,防止别人偷看:
chmod 600 ~/.my.cnf
之后脚本里就不用写密码了,命令可以简化成:
changes=$(mysql -D $DB_NAME -e "SELECT id, content, created_at FROM changes ORDER BY id DESC LIMIT 5;" --skip-column-names)
小补充:处理空结果的情况
如果查询没有返回任何数据(比如最近没变更),变量会是空的,你可以加个判断提示:
if [ -z "$changes" ]; then echo "最近没有数据库变更内容哦" else # 上面的循环打印逻辑 fi
内容的提问来源于stack exchange,提问作者CowardlyDoomsday
相关产品推荐
相关产品推荐

