make变量和shell变量的比较

来源:互联网 发布:vb取整函数函数 编辑:程序博客网 时间:2024/05/17 03:46
一.变量名
  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类似形式的差别
0 0
原创粉丝点击