变量高级用法

简介: 变量高级用法

变量值的替换

我们可以替换变量中的共有的部分,其格式是 $(var:a=b) 或是 ${var:a=b} ,其意思是,把变量 var 中所有以 a 字串 结尾a 替换成 b 字串。这里的 结尾 意思是 空格 或是 结束符


还是看一个示例吧:

foo := a.o b.o c.o
bar := $(foo:.o=.c)点击复制复制失败已复制


这个示例中,我们先定义了一个 $(foo) 变量,而第二行的意思是把 $(foo) 中所有以 .o 字串结尾全部替换成 .c ,所以我们的 $(bar) 的值就是 a.c b.c c.c


另外一种变量替换的技术是以静态模式定义的,如:

foo := a.o b.o c.o
bar := $(foo:%.o=%.c)点击复制复制失败已复制


这依赖于被替换字串中的有相同的模式,模式中必须包含一个 % 字符,这个例子同样让 $(bar) 变量的值为 a.c b.c c.c


把变量的值再当成变量

先看一个例子:

x = y
y = z
a := $($(x))点击复制复制失败已复制


在这个例子中, $(x) 的值是 y ,所以 $($(x)) 就是 $(y) ,于是 $(a) 的值就是 z


注意

x=y ,而不是 x=$(y)


我们还可以使用更多的层次:

x = y
y = z
z = u
a := $($($(x)))点击复制复制失败已复制


这里的 $(a) 的值是 u


让我们再复杂一点,使用上在变量定义中使用变量的第一个方式,来看一个例子:

x = $(y)
y = z
z = Hello
a := $($(x))点击复制复制失败已复制


这里的 $($(x)) 被替换成了 $($(y)) ,因为 $(y) 值是 z ,所以,最终结果是: a:=$(z) ,也就是 Hello


再复杂一点,我们再加上函数:

x = variable1
variable2 := Hello
y = $(subst 1,2,$(x))
z = y
a := $($($(z)))点击复制复制失败已复制


这个例子中, $($($(z))) 扩展为 $($(y)) ,而其再次被扩展为 $($(subst 1,2,$(x)))$(x) 的值是 variable1subst 函数把 variable1 中的所有 1 字串替换成 2 字串,于是, variable1 变成 variable2 ,再取其值,所以,最终, $(a) 的值就是 $(variable2) 的值—— Hello 。(喔,好不容易)

在这种方式中,可以使用多个变量来组成一个变量的名字,然后再取其值:

first_second = Hello
a = first
b = second
all = $($a_$b)点击复制复制失败已复制


这里的 $a_$b 组成了 first_second ,于是, $(all) 的值就是 Hello


再来看看结合第一种技术的例子:

a_objects := a.o b.o c.o
1_objects := 1.o 2.o 3.o
sources := $($(a1)_objects:.o=.c)点击复制复制失败已复制


这个例子中,如果 $(a1) 的值是 a 的话,那么, $(sources) 的值就是 a.c b.c c.c ;如果 $(a1) 的值是 1 ,那么 $(sources) 的值是 1.c 2.c 3.c


再来看一个这种技术和函数条件语句一同使用的例子:

ifdef do_sort
    func := sort
else
    func := strip
endif
bar := a d b g q c
foo := $($(func) $(bar))点击复制复制失败已复制


这个示例中,如果定义了 do_sort ,那么: foo := $(sort a d b g q c) ,于是 $(foo) 的值就是 a b c d g q ,而如果没有定义 do_sort ,那么: foo := $(strip a d b g q c) ,调用的就是 strip 函数。


当然,把变量的值再当成变量这种技术,同样可以用在操作符的左边:

dir = foo
$(dir)_sources := $(wildcard $(dir)/*.c)
define $(dir)_print
lpr $($(dir)_sources)
endef点击复制复制失败已复制


这个例子中定义了三个变量: dirfoo_sourcesfoo_print

目录
相关文章
|
6月前
|
C语言
C 语言中布尔值的用法和案例解析
在编程中,您经常需要一种只能有两个值的数据类型,例如: - 是/否 - 开/关 - 真/假 为此,C语言有一个 `bool` 数据类型,称为布尔值。
208 1
|
SQL 负载均衡 数据可视化
第六章:参数和变量
第六章:参数和变量
519 1
|
6月前
|
存储 编译器 程序员
C/C++中的内建函数介绍:介绍C/C++中内建函数的基本概念、用途和作用
C/C++中的内建函数介绍:介绍C/C++中内建函数的基本概念、用途和作用
104 0
|
运维 Shell Linux
【运维知识高级篇】超详细的Shell编程讲解1(Shell作用+脚本书写方式+脚本执行方式+变量分类+变量配置文件+变量定义+Shell重要的位置变量+三种传参方式)
【运维知识高级篇】超详细的Shell编程讲解1(Shell作用+脚本书写方式+脚本执行方式+变量分类+变量配置文件+变量定义+Shell重要的位置变量+三种传参方式)
358 1
|
存储 Oracle Java
第二章、 数据类型与变量
JavaSE:基本数据类型的讲解和解析,便于已学同学进行复习或刚开始学习Java的学生进行理解。
49 0
|
Linux 编译器 C语言
C语言中宏的一些高级用法举例
C语言中宏的一些高级用法举例
336 0
|
存储 移动开发 数据安全/隐私保护
高级变量类型
Python 中数据类型可以分为 **数字型** 和 **非数字型**
Go语言之自定义模板,修改模板默认变量符号
Go语言之自定义模板,修改模板默认变量符号
108 0
Go语言之自定义模板,修改模板默认变量符号
|
Shell
${ } 引用变量的高级用法
1.1 删除开头或结尾的整段字符串 格式:
137 0
|
存储 前端开发 JavaScript
Web前端学习:JaveScript基础 [简介、用法、变量及数据类型、流程控制及函数] (附源代码)
Web前端学习:JaveScript基础 [简介、用法、变量及数据类型、流程控制及函数] (附源代码)
267 0
Web前端学习:JaveScript基础 [简介、用法、变量及数据类型、流程控制及函数] (附源代码)