核心是将连接参数、sql语句、格式化输出封装为可复用的shell函数,需兼顾参数校验、安全(如mysql_config_editor隐藏密码)、默认值、表格/制表符输出切换及awk美化等,确保干净、安全、易读、可维护。

直接用函数封装 MySQL 查询,核心是把连接参数、SQL 语句、格式化输出三者打包成可复用的 shell 函数,避免每次重复写长命令。关键不在“能不能”,而在“怎么封装得干净、安全、易读、好维护”。
基础封装:带参数校验和默认值
定义一个函数,接受数据库名、表名(或 SQL)、是否启用表格格式等参数:
mysql_query() {
local db="test"
local user="root"
local pass=""
local host="localhost"
local sql=""
local use_table=0
<pre class="brush:php;toolbar:false;">while [[ $# -gt 0 ]]; do
case $1 in
-d|--database) db="$2"; shift 2 ;;
-u|--user) user="$2"; shift 2 ;;
-p|--pass) pass="$2"; shift 2 ;;
-h|--host) host="$2"; shift 2 ;;
-e|--exec) sql="$2"; shift 2 ;;
--table) use_table=1; shift ;;
*) echo "Unknown option: $1"; return 1 ;;
esac
done
if [[ -z "$sql" ]]; then
echo "Error: SQL query required (-e 'SELECT ...')" >&2
return 1
fi
local cmd="mysql -u$user -p$pass -h$host -D$db -N -s"
[[ $use_table -eq 1 ]] && cmd="$cmd --table"
# 执行并去除首尾空行,避免空结果干扰后续处理
eval "$cmd -e \"$sql\"" | sed '/^$/d'}
说明:
• -N 去掉列名
• -s 精简模式(禁用表格边框、对齐等)
• --table 启用后返回对齐表格(适合人工查看)
• 使用 eval 是因 SQL 含空格/引号,但注意:仅用于可信输入,生产环境建议改用 Here Document 或临时文件防注入
结构化结果处理:按字段分割并遍历
若需逐行解析字段(比如取第2列做判断),推荐用制表符分隔 + while read:
mysql_query "SELECT id, name, status FROM users WHERE active=1;" | \
while IFS=$'\t' read -r id name status; do
[[ -n "$id" ]] || continue
echo "User $id: $name → $status"
done
要点:
• IFS=$'\t' 显式设字段分隔符为 tab(MySQL 默认分隔符)
• read -r 防止反斜杠被转义
• 第一行常为空或含列名(加 -N 后已去除),但仍建议加 [[ -n "$id" ]] 安全校验
安全增强:避免密码明文出现在进程列表
用 mysql_config_editor 预存登录配置,彻底隐藏密码:
# 一次性配置(密码交互输入,不落盘明文) mysql_config_editor set --login-path=local --user=root --password --host=localhost <h1>封装函数中改用:</h1><p>mysql --login-path=local -D"$db" -N -s -e "$sql"</p>
好处:
• 进程里看不到 -proot123 类敏感参数
• 多环境可建不同 login-path(如 prod/stage)
• 不依赖环境变量,更可控
结果格式化增强:用 awk 对齐或转 CSV
纯文本结果不够直观?加一层 awk 快速美化:
# 左对齐 ID(10宽),居中 Name(20宽),右对齐 Status(12宽)
mysql_query -e "SELECT id, name, status FROM users;" | \
awk -F'\t' 'BEGIN { OFS="\t" }
{ printf "%-10s %-20s %12s\n", $1, $2, $3 }'
<h1>转 CSV(自动加双引号、转义逗号)</h1><p>mysql_query -e "SELECT * FROM logs LIMIT 5;" | \
awk -F'\t' 'BEGIN{OFS=","} {for(i=1;i</p>提示:
• MySQL 输出默认用 tab 分隔,awk -F'\t' 比空格更可靠
• 若字段含换行或引号,shell 层面处理较难,建议导出为 JSON(用 --json 选项,MySQL 5.7+ 支持)











