|
經(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 |
|
|