如何通过管道传递HereDoc?解决变量制表格式化的语法错误问题
如何通过管道传递HereDoc?解决变量制表格式化的语法错误问题
看起来你遇到的是HereDoc语法和shell代码块的小细节问题,我来帮你搞定!
首先,你报错的核心原因主要有两点:
- HereDoc的结束标记必须是单独一行,不能有任何前导/尾随空格或其他字符,如果你的
EndOfOutput前后不小心加了空格,shell会找不到结束标记,一直读到文件末尾才抛出错误。 - 你用的大括号代码块写法有语法细节没注意到(不过其实这个大括号完全可以去掉,让代码更简洁)
给你两种正确的写法:
写法一:最简洁的直接管道方式
不需要额外的大括号,直接把cat输出的HereDoc内容管道给column命令就行:
cat <<EndOfOutput $o1 $o2 EndOfOutput | column
这里一定要确保EndOfOutput是干净的单独一行,前后没有任何空格,这是HereDoc的硬性要求。
写法二:保留大括号代码块的正确写法
如果你坚持要用大括号把输出逻辑包起来,需要注意shell对代码块的语法要求:
{ cat <<EndOfOutput $o1 $o2 EndOfOutput } | column
注意点:
- 开头的
{后面可以换行,或者加个空格再换行(shell需要识别这是代码块的开始) - 结束的
}必须单独一行,或者前面加个分号(比如; }) - 同样要保证
EndOfOutput是无多余字符的单独一行
另外补充个小技巧:如果你的$o1和$o2是用特定分隔符(比如逗号、冒号)分隔的字段,可以用column -t -s "分隔符"来指定分隔符,让表格对齐更准确,比如:
cat <<EndOfOutput $o1 $o2 EndOfOutput | column -t -s ","
备注:内容来源于stack exchange,提问作者Richard Barraclough
相关产品推荐
相关产品推荐

