一.变量名
make变量名是不包括“:”、“#”、“=”、前置空白和尾空白的任何字符串。
shell中的变量名和C语言中的要求一样,即只能是字母,数字和下划线,且
第一个字符不能是数字
二.定义
shell中也可以嵌套定义,如
VAR="yanghua is good man"
VAR1=$VAR
和make不同,shell中引用的变量要在此前定义过,比如上面的例子中变量$VAR必须在这之前定义过,
shell企图使用VAR1:=$VAR来引用未定义的变量会发生语法错误(shell中没有操作符:=).
三.引用
make中: $(<var>)或${<var>}
shell中: $<var>或${<var>}
即shell不能使用$(<var>)的形式引用变量
四.关于字符$的转义
make中使用两个$表示真正的字符$,如$$VAR,代表的是字符串"$VAR".
shell中使用\$来进行$的转义
五.特殊的变量定义
两者都支持变量的拼接
如shell和make都支持如下的拼接
VAR1=...
VAR2=...
VAR3=$VAR1_$VAR3
在make中则为:
VAR1=...
VAR2=...
VAR3=$(VAR1)_$(VAR3)
但两者的使用还是有差别的:
除了前面提到的不能提前使用变量外,shell中无法使用如下的形式达到变量和一个字符串连接:
VAR1=...
VAR2=$VAR1_hello
shell变量中允许下划线,所以会把VAR1_hello做为一个整体,即一个变量名来解释.只能使用下面的形式:
VAR1=...
VAR2=${VAR1}_hello
可以使用除shell变量允许使用的字符之外的字符把变量和字符串连接起来:
VAR1=...
VAR2=$VAR1-hello
因为shell不会把字符"-"当作变量名的一个字符,而会被认为是一个变量名的结束.
而make跟踪的是{},这一点和上面shell例子中的{}的引用形式相同.可以看出,这能避免连接和变量混淆的困扰
2.空格的使用
和普通的不能用作变量名字符的字符来充当连接符不同,空格,TAB也是无法充当连接符.
当使用空格或TAB;连接两个字符串时,shell或make会试着以变量的形式解释空格和TAB隔开的字符串.
当发现了$字符引导的一个字符串时,shell或make会试着进行变量替换,如果该变量没有定义过,那么
其就为空.当不是以$开头的字符串时,会把它当成一个字符串.
注意结合1体会变量的使用
六.make中变量操作符
1.make中的操作符?=
看一个例子
FOO ?= bar
其含义是,如果FOO没有被定义过,那么变量FOO的值就是“bar”,如果FOO先前被定义过,
那么这条语将什么也不做,其等价于:
ifeq ($(origin FOO), undefined)
FOO = bar
endif
2.变量替换
我们可以替换变量中的共有的部分,其格式是“$(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”。
3.shell中变量的特殊定义形式:
下面列出了变量设置时的不同模式:
Variable-name=value 设置实际值到variable-name
Variable-name+value 如果设置了variable-name,则重设其值
Variable-name:?value 如果未设置variable-name,显示未定义用户错误信息
Variable-name?value 如果未设置variable-name,显示系统错误信息
Variable-name:=value 如果未设置variable-name,设置其值
Variable-name:-value 同上,但是取值并不设置到variable-name,可以被替换
注意和make类似形式的差别
make变量名是不包括“:”、“#”、“=”、前置空白和尾空白的任何字符串。
shell中的变量名和C语言中的要求一样,即只能是字母,数字和下划线,且
第一个字符不能是数字
二.定义
shell中也可以嵌套定义,如
VAR="yanghua is good man"
VAR1=$VAR
和make不同,shell中引用的变量要在此前定义过,比如上面的例子中变量$VAR必须在这之前定义过,
shell企图使用VAR1:=$VAR来引用未定义的变量会发生语法错误(shell中没有操作符:=).
三.引用
make中: $(<var>)或${<var>}
shell中: $<var>或${<var>}
即shell不能使用$(<var>)的形式引用变量
四.关于字符$的转义
make中使用两个$表示真正的字符$,如$$VAR,代表的是字符串"$VAR".
shell中使用\$来进行$的转义
五.特殊的变量定义
两者都支持变量的拼接
如shell和make都支持如下的拼接
VAR1=...
VAR2=...
VAR3=$VAR1_$VAR3
在make中则为:
VAR1=...
VAR2=...
VAR3=$(VAR1)_$(VAR3)
但两者的使用还是有差别的:
除了前面提到的不能提前使用变量外,shell中无法使用如下的形式达到变量和一个字符串连接:
VAR1=...
VAR2=$VAR1_hello
shell变量中允许下划线,所以会把VAR1_hello做为一个整体,即一个变量名来解释.只能使用下面的形式:
VAR1=...
VAR2=${VAR1}_hello
可以使用除shell变量允许使用的字符之外的字符把变量和字符串连接起来:
VAR1=...
VAR2=$VAR1-hello
因为shell不会把字符"-"当作变量名的一个字符,而会被认为是一个变量名的结束.
而make跟踪的是{},这一点和上面shell例子中的{}的引用形式相同.可以看出,这能避免连接和变量混淆的困扰
2.空格的使用
和普通的不能用作变量名字符的字符来充当连接符不同,空格,TAB也是无法充当连接符.
当使用空格或TAB;连接两个字符串时,shell或make会试着以变量的形式解释空格和TAB隔开的字符串.
当发现了$字符引导的一个字符串时,shell或make会试着进行变量替换,如果该变量没有定义过,那么
其就为空.当不是以$开头的字符串时,会把它当成一个字符串.
注意结合1体会变量的使用
六.make中变量操作符
1.make中的操作符?=
看一个例子
FOO ?= bar
其含义是,如果FOO没有被定义过,那么变量FOO的值就是“bar”,如果FOO先前被定义过,
那么这条语将什么也不做,其等价于:
ifeq ($(origin FOO), undefined)
FOO = bar
endif
2.变量替换
我们可以替换变量中的共有的部分,其格式是“$(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”。
3.shell中变量的特殊定义形式:
下面列出了变量设置时的不同模式:
Variable-name=value 设置实际值到variable-name
Variable-name+value 如果设置了variable-name,则重设其值
Variable-name:?value 如果未设置variable-name,显示未定义用户错误信息
Variable-name?value 如果未设置variable-name,显示系统错误信息
Variable-name:=value 如果未设置variable-name,设置其值
Variable-name:-value 同上,但是取值并不设置到variable-name,可以被替换
注意和make类似形式的差别