You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本提取MySQL show variables结果中值的问题

问题分析

你遇到的问题根源在于错误地同时使用了-t和-B参数:-t会强制输出带边框的表格格式(包含+、|这些分隔符),而你后续用tr处理时,误解了tr的工作方式——tr是字符级替换,不是字符串替换,所以tr "datadir " "\n"会把d、a、t、i、r以及空格这些单个字符全部替换成换行,导致路径被拆碎,出现了/v /l b/mysql/这种错乱结果。

最优解决方案:直接修改MySQL命令(推荐)

既然你只需要datadir的纯值,完全不需要表格格式,直接去掉-t参数,保留-B(批处理模式,无格式化输出)和--skip-column-names(不输出列名)即可,命令会直接返回你要的路径,不需要任何后续处理:

# 直接获取datadir的值
data=$(mysql -u root -proot -B --skip-column-names -e "show variables where variable_name = 'datadir';")
echo "$data"

执行后会直接输出:/var/lib/mysql/

备选方案:处理现有表格格式输出(如果必须保留-t)

如果因为某些限制必须处理带表格的输出,可以用awk或sed来精准提取值,避免tr的字符替换问题:

方法1:用awk提取

data=$(mysql -u root -proot -t -e "show variables where variable_name = 'datadir';")
# 找到包含datadir的行,清理边框和空格后提取第二个字段
datadir=$(echo "$data" | awk '/datadir/ {gsub(/\|/, ""); gsub(/^[[:space:]]+|[[:space:]]+$/, ""); print $2}')
echo "$datadir"

方法2:用sed替换清理

data=$(mysql -u root -proot -t -e "show variables where variable_name = 'datadir';")
# 匹配datadir行,去掉左右的|和多余空格
datadir=$(echo "$data" | sed -n '/datadir/s/.*| *//;s/ *|.*//p')
echo "$datadir"

这两种方法都能正确提取出/var/lib/mysql/。

内容的提问来源于stack exchange,提问作者Chamara Maduranga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 17:23:01