linux Makefile 和shell 语法区别

本文探讨了Makefile与Shell语法的异同,指出Makefile实际上包含了Shell语法,如$(shell)函数。主要区别在于通配符使用(* vs %),变量引用($var vs $(var)),变量赋值规则,多行执行方式,以及条件判断和循环结构。Makefile使用ifeq和ifdef进行条件判断,而Shell使用if和for/while循环。
摘要由CSDN通过智能技术生成

其实这里谈区别不太对, 应为makefile 语法中就包含shell 语法,比如 Makefile 的$(shell ) 函数 就是shell 语句。 而在makefile 中能用到shell 的地方就两处 1, $(shell ) 函数,2, target 语句。 Makefile 语法其实就是Makefile + shell 来实现编译控制的。 

他们的语法也有一些不一样的地方:

1)通配符不一样
  shell:*
 Makefile:%
2)引用变量不一样
shell:$var   或者${var}
Makefile:$(var)  或者${var}

3) 变量赋值

    shell: var=a   等号两边不能有空格

    makefile: var = a  允许有空格
 4)Makefile的每一行都是开辟一个进程来执行,所有要执行多个shell用\,来认为一行,所以多行设定变量时,里面无法传递变量

5) Makefile为了避免和shell的变量冲突,shell的变量以$$开头

     PROJECT_ROOT_DIR = $(shell pwd | awk -F'/application|/base_class' '{print $$1}')

6)

条件判断if
shell:
if [ $NOW_VAR == 1 ];then
echo "var is 1"
elif [ $NOW_VAR == 2 ];then
echo "var is 2"
else
echo "var is not 1"
fi
 
 
Makefile:
NOW_DIR=$(shell pwd)
ifeq ($(NOW_VAR), 1)
NOW_DIR="in 1"
else ifeq ($(NOW_VAR), 2)
NOW_DIR="in 2"
else
NOW_DIR="in not 1 or 2"
endif
all:
         echo $(NOW_DIR)
 
 
ifneq ($(NOW_VAR), 1)
endif
 
ifdef V
endif
ifndef V
endif
 
 
 
 for循环
shell:
for pid in ${pids};
do
xxxxx
done
 
while循环
shell:
while true
do
xxxx
done        
        
 Makefile中的for循环,采用shell的for循环
file=1 2 3 4 5
all:
    for name in $(file); \
    do \
    echo $$name;  \
    done

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值