bash - Makefile中的基本if else语句

标签 bash if-statement makefile

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

相关文章:

c++ - 在 g++ 中生成 "-L"和 -rpath 标志的等效函数是什么

linux - source 命令没有使用 shell 脚本将变量导出到 zsh 环境

linux - 使用 awk 更改文件的特定行

linux - 将当前文件名回显到文本文件ubuntu?

bash 函数在 zsh env 中不起作用

javascript - 否则如果javascript

python - 我该如何压缩循环,否则

c - 当用户点击 'Enter' 时使用 getchar() 退出循环?

linux - 使用cmake创建一个无cmake的Makefile

compilation - 使用 Gnu Make 实用程序自动创建具有与源不同的构建结构的文件