语法错误:文件结尾意外结束(期望“fi”)

22

我正在使用bash编写makefile,有一个目标需要查找文件是否存在,尽管我认为语法是正确的,但仍然出现错误。

以下是我正在尝试运行的脚本:

read: 
        if [ -e testFile] ; then \ 
        cat testFile\ 
        fi
我正在使用选项卡,所以这不是问题。
错误是(当我输入“make read”时)。
if [ -e testFile] ; then \
        cat testFile \
        fi
/bin/sh: Syntax error: end of file unexpected (expecting "fi")
make: *** [read] Error 2
4个回答

35

尝试在cat testFile之后加上一个分号。例如:

read: 
    if [ -e testFile ] ; then  cat testFile ; fi

或者说:

read:
    test -r testFile && cat testFile

2
替代方案可行,但我必须使用if..then语法。添加分号似乎无法解决这个问题。 - Jaelebi
奇怪。我第一次尝试使用分号,但它没有起作用。第二次运行时它就可以了。谢谢。 - Jaelebi
自己做个笔记:我最初在Makefile中编写了普通的多行bash语句,但是遇到了相同的失败情况 - 正如这个答案所指出的那样,诀窍在于让Makefile将shell命令识别为单行;因此,我需要使用分号;(用于分隔shell命令)和反斜杠\\(用于转义后续的换行符),以使其正常工作...干杯! - sdaau
请参阅https://dev59.com/YWMl5IYBdhLWcg3wwZIq#18554356 - dan

9
我遇到了同样的问题。这应该可以解决它:
file:
    @if [ -e scripts/python.exe ] ; then \
    echo TRUE ; \
    fi

5
自从GNU Make 3.82版本以后,你可以在文件顶部添加.ONESHELL:来告诉make在单个shell中运行目标内的所有行。
.ONESHELL:
SHELL := /bin/bash

foobar:
    if true
    then
        echo hello there
    fi

请参阅文档

在每行前加上@或在.ONESHELL:下添加.SILENT:选项以抑制回显行。


2
我也遇到了这个问题。原因是在“\”后面添加了一些注释。

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