BASH脚本终端显示正常但TXT文件输出对齐异常问题
终端对齐正常但TXT文件输出表格错位的解决方法
问题核心
你在Bash脚本中通过SQL生成的表格内容,终端显示时列对齐正常,但写入TXT文件后出现错位。根本原因是:
- 命令替换
$(...)会触发Bash对连续空白字符的合并,导致表格用来对齐的多空格被压缩成单个空格 - 若SQL输出使用制表符(Tab)对齐,不同文本编辑器对Tab的解析宽度不一致,也会引发错位
解决方案
方案1:跳过命令替换,直接输出到文件
原代码通过printf "%s" "$(txt_item ...)"捕获输出的方式,会丢失连续空格格式。修改写入逻辑,直接将txt_item的输出追加到文件:
if [ "$print_txt" = true ]; then txt_item "Database Overview" "$result" "$details" >> "$TXT_FILENAME" fi
此方式可完整保留result和details中的所有空格、换行,避免格式被篡改。
方案2:将SQL输出的制表符转换为固定宽度空格
如果SQL查询用制表符(Tab)对齐列,终端默认将Tab展开为8个空格,但部分编辑器可能用不同宽度解析。用expand命令将Tab转换为固定宽度的空格:
# 对SQL查询结果添加expand处理 db_overview=$(your_sql_database_query | expand -t 8) instance_overview=$(your_sql_instance_query | expand -t 8)
-t 8指定将每个Tab替换为8个空格,确保在任何等宽字体环境下对齐一致。
方案3:用printf替代echo控制输出格式
修改txt_item函数,用printf精准控制输出,避免echo潜在的格式问题:
function txt_item() { local h="$1" local result="$2" local details="$3" printf '\n\n# ######################################\n# %s\n# ######################################\n\n%s' "$h" "$result" if [ -n "$details" ]; then printf '\n\n# %s.DETAILS\n\n%s' "$h" "$details" fi printf '\n' }
此方法可确保输出的空白字符完全保留,同时精准控制换行和格式。
内容的提问来源于stack exchange,提问作者lukasschr
相关产品推荐
相关产品推荐

