为什么我的here-docs(<&lt ;-))给我一个语法错误?

时间:2011-08-11 06:16:31

标签: bash operators

methods() {
        cat <<-!
        start
        stop
        restart
        reload
        status
        methods
        !
}

这是否正确我收到错误

syntax error: unexpected end of file

1 个答案:

答案 0 :(得分:6)

对于古代shell中的here-docs,你必须完全匹配标签。这意味着:

methods() {
        cat <<!
        start
        stop
        restart
        reload
        status
        methods
!
}

是的,在该行的开头,虽然你可以做一些棘手的事情,比如cat <<'^I!'将标记设置为单个标签,后跟!

现在bash(以及可能更早的shell)修复了<<-变体,它在处理之前剥离了数据行和结束标记的所有前导标签。这样,你仍然可以很好地缩进:

methods() {
        cat <<-!
        start
        stop
        restart
        reload
        status
        methods
        !
}

但是,请注意附带条件:它剥离标签,一般不是空格。如果在!个字符之前的任何地方有空格(或任何非制表符,可打印或其他字符),它就无法工作。

如果您正在使用vi,则可以输入:set list以更好地查看不可打印字符,否则xdod -xcb可以为您提供文件的十六进制转储。