小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

shell特定變量和Makefile中自動化變量的對比記憶

 fym0121 2011-03-01
 經(jīng)常在shell命令行見到$*,$#,$@...這些特定變量,還有在Makefile中看到一些以$開頭的自動化變量,為了方便記憶,不產(chǎn)生混淆,特總結(jié)出來,希望可以給大家?guī)硪恍椭?/div>
1.     shell中特定的變量
$#   傳遞到腳本的參數(shù)個數(shù)
$*    以一個單字符串顯示所有向腳本傳遞的參數(shù)。與位置變量不同,此選項參數(shù)可超過9個
$$    腳本運行的當(dāng)前進程PID號
$!     后臺運行的最后一個進程的進程號
$@   與$*相同,但是使用時用雙引號,并將各個參數(shù)加雙引號返回
$-     顯示shell使用的當(dāng)前選項,與set命令功能相同
$_    上一個命令的最后一個參數(shù)
$?     顯示最后命令的退出狀態(tài),0表示執(zhí)行成功 ,其他值有問題
$0     腳本名稱
$1...$9    位置參數(shù)
測試腳本如下
#vim test
#!/bin/bash
echo $0
echo $*
echo $@
echo $#
echo $$
ls -a /home
echo $_
#chmod +x test
#./test -a -b -c /home
./test
-a -b -c /home/
-a -b -c /home/
4
20814
.  ..  qxl
/home
#echo $?
0
#ls -a /home &
[1] 20838
#.  .. qxl
[1]+ Done                  ls --color=tty -a /home
#echo $!
20838
2    Makefile中自動化變量
$@
表示規(guī)則中的目標(biāo)文件集。在模式規(guī)則中,如果有多個目標(biāo),那么,"$@"就是匹配于
目標(biāo)中模式定義的集合。
$%
僅當(dāng)目標(biāo)是函數(shù)庫文件中,表示規(guī)則中的目標(biāo)成員名。例如,如果一個目標(biāo)是"foo.a (bar.o)",那么,"$%"就是"bar.o","$@"就是"foo.a"。如果目標(biāo)不是函數(shù)庫文件(Unix下是[.a],Windows下是[.lib]),那么,其值為空。
$<
依賴目標(biāo)中的第一個目標(biāo)名字。如果依賴目標(biāo)是以模式(即"%")定義的,那么"$<"將是符合模式的一系列的文件集。注意,其是一個一個取出來的。
$?
所有比目標(biāo)新的依賴目標(biāo)的集合。以空格分隔。
$^
所有的依賴目標(biāo)的集合。以空格分隔。如果在依賴目標(biāo)中有多個重復(fù)的,那個這個變量會去除重復(fù)的依賴目標(biāo),只保留一份。
$+
這個變量很像"$^",也是所有依賴目標(biāo)的集合。只是它不去除重復(fù)的依賴目標(biāo)。
$*
這個變量表示目標(biāo)模式中"%"及其之前的部分。如果目標(biāo)是"dir/a.foo.b",并且目標(biāo)的模式是"a.%.b",那么,"$*"的值就是"dir/a.foo"。這個變量對于構(gòu)造有關(guān)聯(lián)的文件名是比較有較。如果目標(biāo)中沒有模式的定義,那么"$*"也就不能被推導(dǎo)出,但是,如果目標(biāo)文件的后綴是make所識別的,那么"$*"就是除了后綴的那一部分。例如:如果目標(biāo)是"foo.c",因為".c"是make所能識別的后綴名,所以,"$*"的值就是"foo"。這個特性是GNU make的,很有可能不兼容于其它版本的make,所以,你應(yīng)該盡量避免使用"$*",除非是在隱含規(guī)則或是靜態(tài)模式中。如果目標(biāo)中的后綴是make所不能識別的,那么"$*"就是空值。

當(dāng)你希望只對更新過的依賴文件進行操作時,"$?"在顯式規(guī)則中很有用,例如,假設(shè)有一個函數(shù)庫文件叫"lib",其由其它幾個object文件更新。那么把object文件打包的比較有效率的Makefile規(guī)則是:
lib : foo.o bar.o lose.o win.o
ar r lib $?
在上述所列出來的自動量變量中。四個變量($@、$<、$%、$*)在擴展時只會有一個文件,而另三個的值是一個文件列表。這七個自動化變量還可以取得文件的目錄名或是在當(dāng)前目錄下的符合模式的文件名,只需要搭配上"D"或"F"字樣。這是GNU make中老版本的特性,在新版本中,我們使用函數(shù)"dir"或"notdir"就可以做到了。"D"的含義就是Directory,就是目錄,"F"的含義就是File,就是文件。
下面是對于上面的七個變量分別加上"D"或是"F"的含義:
$(@D)
表示"$@"的目錄部分(不以斜杠作為結(jié)尾),如果"$@"值是"dir/foo.o",那么"$(@D)"就是"dir",而如果"$@"中沒有包含斜杠的話,其值就是"."(當(dāng)前目錄)。
$(@F)
表示"$@"的文件部分,如果"$@"值是"dir/foo.o",那么"$(@F)"就是"foo.o","$(@F)"相當(dāng)于函數(shù)"$(notdir $@)"。
"$(*D)"
"$(*F)"
和上面所述的同理,也是取文件的目錄部分和文件部分。對于上面的那個例子,"$(*D)"返回"dir",而"$(*F)"返回"foo"
"$(%D)"
"$(%F)"
分別表示了函數(shù)包文件成員的目錄部分和文件部分。這對于形同"archive(member)"形式的目標(biāo)中的"member"中包含了不同的目錄很有用。
"$(<D)"
"$(<F)"
分別表示依賴文件的目錄部分和文件部分。
"$(^D)"
"$(^F)"
分別表示所有依賴文件的目錄部分和文件部分。(無相同的)
"$(+D)"
"$(+F)"
分別表示所有依賴文件的目錄部分和文件部分。(可以有相同的)
"$(?D)"
"$(?F)"
分別表示被更新的依賴文件的目錄部分和文件部分。
最后想提醒一下的是,對于"$<",為了避免產(chǎn)生不必要的麻煩,我們最好給$后面的那個特定字符都加上圓括號,比如,"$(<)"就要比"$<"要好一些

本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/peking2008xiaoxin/archive/2009/11/10/4792844.aspx

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多