make變數和shell變數的比較

2021-07-31 03:40:35 字數 2565 閱讀 2837

一.變數名

make變數名是不包括「:」、「#」、「=」、前置空白和尾空白的任何字串。

shell中的變數名和c語言中的要求一樣,即只能是字母,數字和下劃線,且

第乙個字元不能是數字

二.定義

shell中也可以巢狀定義,如

var="yanghua is good man"

var1=$var

和make不同,shell中引用的變數要在此前定義過,比如上面的例子中變數$var必須在這之前定義過,

shell企圖使用var1:=$var來引用未定義的變數會發生語法錯誤(shell中沒有操作符:=).  

三.引用

make中: $()或${}

shell中: $或${}

即shell不能使用$()的形式引用變數

四.關於字元$的轉義

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=$_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」字串「結尾」的「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 中的變數

在 makefile 檔案中,常使用變數來表示檔名,這樣更加方便.定義變數,形式如 變數 檔名1 檔名2 使用變數,形式如 變數 等效為 檔名1 檔名2 make 中變數的使用機制類似於 c c 中 define的使用機制 乙個小例子 定義變數 obj a.o b.o test obj 等效於 te...

Makefile中的變數和shell變數

我們在寫makefile時 多多少少會用到shell指令碼,對於變數的在shell中的使用有一些要注意的細節。讓我們從乙個簡單的makefile來看看。注意makefile中一定要有乙個目標,且一定要有乙個終極目標,若想要有多個目標應該設立乙個偽目標。如下 all hello hello2 hell...

變數 shell變數( )

變數型別 執行shell時,會同時存在三種變數 a 區域性變數 在指令碼或命令中定義,僅在當前shell例項中有效,其他shell啟動的程式不能訪問區域性變數。b 環境變數 所有的程式,包括shell啟動的程式,都能訪問環境變數,有些程式需要環境變數來保證其正常執行。必要時shell指令碼也可以定義...