Makefile中的变量和shell变量
我们在写makefile时 多多少少会用到shell脚本, 对于变量的在shell中的使用有一些要注意的细节。让我们从一个简单的makefile来看看。
注意makefile中一定要有一个目标,且一定要有一个终极目标,若想要有多个目标应该设立一个伪目标。如下:
all: hello hello2 hello3
hello: hello.c
gcc ....
hello2: hello2.c
gcc ...
hello3: hello3.c
gcc ...
- shell变量定义和使用:
NAME=hello #这里一定不要有空格 hello可以加上""或'' 若定义的值有空格 则要加上"" 或 ''
echo $NAME #这里使用变量时 要加上$ 也可以${NAME} 但是不能$()这个表示执行里面的命令
- makefile中的变量定义:
HHH=hello #方式一
ZZZ = hello #方式二
all:
echo $HHH #这样输出并不能输出HHH的值 A
echo $ZZZ #同上
echo $(HHH) # 输出hello B
echo $(ZZZ) # 输出hello 这里可以看到有别与shell变量定义。
echo ${HHH} # 输出hello C
echo ${ZZZ} # 输出hello
echo $$HHH # 输出空 #$$这种方式是shell中使用makefile中定义的变量 这是一个command line。 D
echo $$ZZZ # 输出空
if [ -n "${HHH}" ];then echo "OK";fi; #这里正确输出OK E
if [ -n "${ZZZ}" ];then echo "OK";fi; # 正确输出OK
if [ -n "$(HHH)" ];then echo "OK";fi; # 正确输出OK H
if [ -n "$(ZZZ)" ];then echo "OK";fi; # 正确输出OK
if [ -n "$HHH" ];then echo "OK";fi; # 变量名不正确 J
if [ -n "$ZZZ" ];then echo "OK";fi; # 变量名不正确
if [ -n "$$ZZZ" ];then echo "OK";fi; #没有输出 K
if [ -n "$$HHH" ];then echo "OK";fi;#没有输出
if [ -n $$ZZZ ];then echo "OK";fi; #输出OK L
if [ -n $$HHH ];then echo "OK";fi;#输出OK
我认为makefile的变量定义使用就像是c/c++中的宏的使用方式 只是替换而已
1. 情况A中: echo $HHH 是优先于第一个字符结合去找$H变量 但是这里没有H定义 所以A这种情况 就是 echo HH 会输出HH
2. 情况BC中:正确的使用方式
3. 情况D中:变量名变为$HHH 这样的变量名为空
4. EH 中: 正确
5. J中$HHH 变为 HH
6. K 因为没有定义$HHH这个变量
7. L 正确方式 与D的差别就是这句是shell D是command
以上是结合实际情况的个人理解
总结就是 makefile变量定义可以有空格, 使用变量时用$() 若在shell中使用makefile中定义的变量时,要使用$$ 并且一定不要使用“”和‘’。
Makefile中的变量和shell变量的更多相关文章
- 【Shell脚本学习6】Shell变量:Shell变量的定义、删除变量、只读变量、变量类型
Shell支持自定义变量. 定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编 ...
- 【转】shell 教程——06 Shell变量:Shell变量的定义、删除变量、只读变量、变量类型
Shell支持自定义变量. 定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编 ...
- 从hivesql结果中读取数值到shell变量的方法
为了检查hive表中的数据,并统计展现,需要将查出的结果传入到shell变量,然后统一输出到文本. 最后使用了以下两个方法: 方法一 QUAN=$(hive -S -e "select co ...
- linux如何使make输出makefile中所有的规则和变量
答: make -p (会执行makefile,加入-q可以阻止makefile的执行)
- Shell变量:Shell变量的定义、删除变量、只读变量、变量类型
http://c.biancheng.net/cpp/shell/ 1.打印 2.运算符
- (转载)linux中shell变量
(转载)http://blog.csdn.net/zahuopuboss/article/details/8633891 为使shell编程更有效,系统提供了一些shell变量.shell变量可以保存 ...
- awk中引用shell变量的方法
1.通过命令行参数定义变量时引用: awk -v awk变量名= shell变量名 #!/bin/bash var4bash=test awk -v var4awk="$var4bash&q ...
- makefile中的shell编程注意点
参考:http://blog.csdn.net/wanglang3081/article/details/49423105 (1)Makefile本质上来讲也是shell脚本,即每条command都是 ...
- shell变量
定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名 ...
随机推荐
- typeof、constructor和instance
在JavaScript中,我们经常使用typeof来判断一个变量的类型,使用格式为:typeof(data)或typeof data.typeof返回的数据类型有六种:number.string.bo ...
- idea的debug调试快捷键
1 2 3 4 5 6 7 8 9 10 F9 resume programe 恢复程序 Alt+F10 show execution point 显示执行断点 F8 ...
- 笔记-windbg及时调试
当程序在测试或者老化的时候很有用,只要程序有异常抛出,就能启用windbg调试,这样就能及时的保存现场. 程序崩溃时,windows系统会调用系统默认调试器,其设置在注册表 HKEY_LOCAL_MA ...
- OpenCV Image Watch 调试插件
昨晚偶然发现vs2012的这个很神奇的插件,对于经常使用opencv的人来说,这个插件无疑是我们的调试神器.今天马上下载试用,感觉超级棒!~以后要想查看图像结果,不用再imshow了! Image W ...
- 暑假练习赛 004 E Joint Stacks(优先队列模拟)
Joint StacksCrawling in process... Crawling failed Time Limit:4000MS Memory Limit:65536KB 64 ...
- 理解Java包
本质上,包是一个唯一命名的类的集合,将类集合到包里面的主要原因,是为了当在应用程序中使用预先编写的类时避免与类自身可能引起的明明冲突.用于包中的类名不会妨碍另一个包或程序中的类名,因为此时,包中的类名 ...
- 初窥图像识别与k-means算法
前段时间做了一个车型识别的小项目,思路是利用k-means算法以及词袋模型来做的. 近年来图像识别的方法非常非常多,这边只记录一下我那个项目的思路,核心思想是k-means算法和词汇树. 很遗憾没有做 ...
- $.grep()函数
定义和用法 $.grep() 函数使用指定的函数过滤数组中的元素,并返回过滤后的数组. 提示:源数组不会受到影响,过滤结果只反映在返回的结果数组中. 语法 $.grep( array, functio ...
- 快速学会使用Fiddler抓包 截包伪造提交包
1.Fiddler介绍 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑,移动设备和互联网之间的http通讯,设置断点,查看所有的"进出"Fiddler的 ...
- 解决Cordova安装Cannot find module 'bplist-parser'问题
安装完cordova出现找不到必须的模块 出现原因不明,不过如果出现这个问题,我们遇到缺什么模块就安装什么模块就可以了.如图所示