我试图在Makefile中执行一个简单的if语句:
check:
if [ -z "$(APP_NAME)" ]; then \
echo "Empty" \
else \
echo "Not empty" \
fi
当我执行
make check
时,出现以下错误:if [ -z "" ]; then
/bin/bash: -c: line 1: syntax error: unexpected end of file
make: *** [check] Error 2
知道我在做什么错吗?
我知道我可以使用以下内容,但是在回显之后我有很多逻辑,因此我需要将其分布在多行中:
check:
[ -z "$(PATH)" ] && echo "Empty" || echo "Not empty"
最佳答案
将您的设为目标(添加分号):
check:
if [ -z "$(APP_NAME)" ]; then \
echo "Empty"; \
else \
echo "Not empty"; \
fi
要在不带换行符的shell中评估语句(换行符会被反斜杠\
占用),您需要正确地以分号结尾。您不能在Makefile中使用真实的换行符作为条件shell脚本代码(请参阅 Make特定的背景)[ -z "$(APP_NAME)" ]
,echo "Empty"
,echo "Not empty"
是所有需要评估的语句(类似于在键入命令后在终端中按Enter键)。特定制作背景
make 会为一行中的每个命令生成一个新的shell,因此您不能像这样使用真正的多行shell代码。在脚本文件中。
极端地说,在shell脚本文件中可能会发生以下情况,因为换行符充当命令评估(就像在终端中按回车键是对输入的命令进行评估的换行符一样):
if
[ 0 ]
then
echo "Foo"
fi
list 1如果您将其写在Makefile中,则
if
将在其自己的shell中进行评估(如果将更改为,则将其 shell 状态),然后从技术上讲,条件[ 0 ]
将在其自身的shell中再次进行评估,而无需与之前的任何连接if
。但是, make 甚至都不会超过第一个
if
,因为它希望退出代码继续执行下一条语句,而从仅将shell的状态更改为if
不会获得该退出代码。换句话说,如果make-target中的两个命令彼此完全独立(从来没有任何条件),则可以仅通过普通换行符将它们完美地分开,然后让它们在自己的shell中执行。
因此,为了使使正确评估多行条件的shell脚本,您需要在一行中评估整个shell脚本代码(因此所有代码都在同一个shell中进行评估)。
因此,为了评估Makefile中 list 1中的代码,需要将其转换为:
if \
[ 0 ]; \
then \
echo "Foo"; \
fi
最后一个命令fi
不需要反斜杠,因为那是我们不再需要保持生成的 shell 打开的地方。
关于bash - Makefile中的基本if else语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58602758/