为什么我的此处文档 (<<-) 给出语法错误?
methods() {
cat <<-!
start
stop
restart
reload
status
methods
!
}
这是正确的吗我收到错误
syntax error: unexpected end of file
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
对于古代 shell 中的here-docs,您必须完全匹配标签。这意味着:
是的,在行的开头,尽管您可以做一些棘手的事情,例如
cat <<< '^I!'
将标记设置为单个制表符,后跟!
。现在,
bash
(可能还有早期的 shell)使用<<-
变体修复了这个问题,该变体在处理之前从数据行和结束标记中删除所有前导制表符。这样,您仍然可以很好地缩进:但是,请注意附带条件:它会删除制表符,而不是一般的空格。如果在
!
字符之前的任何位置有空格(或任何非制表符、可打印字符或其他字符),则它将不起作用。如果您使用的是
vi
,可以输入:set list
来更好地查看不可打印的字符,否则输入xd
或od -xcb
可以为您提供文件的十六进制转储。For here-docs in ancient shells, you have to match the tag exactly. That means:
Yes, at the start of the line, although you could do tricky things like
cat <<'^I!'
to set the marker to a single tab followed by!
.Now
bash
(and possibly earlier shells) fixed that with the<<-
variant which strips off all leading tabs from your data lines and the end marker before processing. That way, you could still indent nicely:But, note the proviso: it strips tabs, not whitespace in general. If you have spaces (or any non-tab character, printable or otherwise) anywhere before that
!
character, it won't work.If you're using
vi
, you can enter:set list
to see the non-printable characters a bit better, otherwisexd
orod -xcb
can give you a hex dump of your file.