gpt4 book ai didi

bash - Makefile中的基本if else语句

转载 作者:行者123 更新时间:2023-12-03 15:44:01 26 4
gpt4 key购买 nike

我试图在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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com