"cat <<- _EOF_" 的Shell脚本

4

这个shell脚本出现了错误:

line 6: warning: here-document at line 2 delimited by end-of-file (wanted `_EOF_')

以下是代码:

#!/bin/bash
    cat <<- _EOF_  
        test:  
        1. test  
        0. test test   
    _EOF_

但它是正确的。
#!/bin/bash
cat <<- _EOF_  
    test:  
    1. test  
    0. test test   
_EOF_  

如果您在行首有TAB字符,就不会看到警告。 - devnull
2个回答

6
从Bash手册中可以看到:
如果重定向运算符是<<-,那么输入行中的所有前置制表符都会被删除,以及包含定界符的行。这允许在shell脚本中按自然方式缩进here-documents。
也就是说,如果您使用空格而不是制表符对这些行进行缩进,它将失败。
另一个看不见的问题是终止词必须单独出现在一行上,周围不能有任何东西。唯一的例外是前导制表符,如果您使用<<-而不是<<。因此,在_EOF_行的尾随空格会导致此问题。
顺便说一句,测试确实显示Bash将容忍<<-和终止词之间的空格,但它没有在Bash手册中显示为允许的。这可能是一个可移植性问题。

我确定我用制表符缩进了这些行。 - lzbferrari
@lzbferrari:你在编辑器中使用了制表符,但是你的编辑器是否设置为将它们保存为制表符,还是将它们静默地转换为空格?如果你不确定,可以在文件上使用“od”或“hexdump”命令。此外,你是否检查了“_EOF_”行末尾的空格? - Warren Young
抱歉,我没有仔细检查。我认为我需要修改vimrc文件。 - lzbferrari
@lzbferrari:将来,由于您正在使用Vim,更快的测试方法是Vim将允许您键入/<Tab>。也就是说,您可以直接搜索制表符,如果它们已被转换为空格,则不会找到它们。您可能需要保存并重新打开文件以确保,但在长文件上,这比查看od输出要快得多。 - Warren Young
我也遇到了同样的问题。在测试了你提供的解决方案之后,我发现“空格错误”只出现在某些 shell 函数中,而不是所有 shell 函数中。顺便说一下,我正在使用 bash 5.0。 - Cable W

2
-选项用于here document <<-,它可以抑制文档正文中的前导制表符,但不能抑制空格。因此,将空格替换为制表符,然后警告消息就会消失。
例如:
if true;
then
        cat <<- _EOF_
            test:
            1. test
            0. test test
        _EOF_

fi

Reference Link


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接