Bash如何最简实现两个变量的行内容分别输出为独立两列?
问题根因
你之前的命令出现列错位,核心是两个细节没处理对:
- Bash执行命令替换
$(...)时,会自动删除捕获输出末尾的所有换行符,var1、var2存储的内容最后一行是没有行终止符的 - 你用
printf %s "$var1"输出变量内容时,没有补齐末尾缺失的换行,导致paste识别不到第一个输入流的最后一行边界,直接把var2的第一行内容拼接到var1最后一行后面堆在第一列,才会出现var2内容从var1内容下方错位到第一列的问题
最简实现方案
只需要给两个变量的输出末尾补全缺失的换行,paste就能正确按行拆分,把两个变量的内容分别放到独立列:
paste <(printf '%s\n' "$var1") <(printf '%s\n' "$var2")
如果需要自动适配列宽、排版更规整,直接在后面接column -t即可,不会再出现错位问题:
paste <(printf '%s\n' "$var1") <(printf '%s\n' "$var2") | column -t
可选优化建议
不建议通过解析ls输出生成文件列表,碰到带空格、特殊控制字符的文件名时容易出问题,更稳妥的写法是用数组直接存储匹配到的文件列表:
# 开启通配符无匹配时返回空的规则 shopt -s nullglob # 直接用通配符匹配指定类型文件存入数组 var1=(./somedir1/*matching_filetype1*) var2=(./somedir2/*matching_filetype2*) # 输出时遍历数组元素即可 paste <(printf '%s\n' "${var1[@]}") <(printf '%s\n' "${var2[@]}") | column -t
内容的提问来源于stack exchange,提问作者Server Admin
相关产品推荐
相关产品推荐

