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
相关产品推荐
相关产品推荐

