1. 程式人生 > >shell指令碼及makefile中的特殊變數

shell指令碼及makefile中的特殊變數

shell指令碼中的特殊變數

1. $# 傳遞到指令碼的引數個數

2. $* 以一個單字串顯示所有向指令碼傳遞的引數。與位置變數不同,此選項引數可超過9個
3. $$ 指令碼執行的當前程序ID號
4. $! 後臺執行的最後一個程序的程序ID號
5. [email protected] 與$#相同,但是使用時加引號,並在引號中返回每個引數
6. $- 顯示shell使用的當前選項,與set命令功能相同

7. $? 顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。

$0 指令碼名字
$1 位置引數 #1
$2 - $9 位置引數 #2 - #9
${10} 位置引數 #10
$# 位置引數的個數
"$*" 所有的位置引數(作為單個字串) *
"[email protected]" 所有的位置引數(每個都作為獨立的字串)
${#*} 傳遞到指令碼中的命令列引數的個數
${#@} 傳遞到指令碼中的命令列引數的個數
$? 返回值
$$ 指令碼的程序ID(PID)
$- 傳遞到指令碼中的標誌(使用set)
$_ 之前命令的最後一個引數
$! 執行在後臺的最後一個作業的程序ID(PID)

makefile中的自動化變數

下面對所有的自動化變數進行說明:

[email protected]

表示規則的目標檔名。如果目標是一個文件檔案(Linux中,一般稱.a檔案為文件檔案,也稱為靜態庫檔案),那麼它代表這個文件的檔名。在多目標模式規則中,它代表的是哪個觸發規則被執行的目標檔名。

$%

當規則的目標檔案是一個靜態庫檔案時,代表靜態庫的一個成員名。例如,規則的目標是“foo.a(bar.o)”,那麼,“$%”的值就為“bar.o”,“[email protected]”的值為“foo.a”。如果目標不是靜態庫檔案,其值為空。

$<

規則的第一個依賴檔名。如果是一個目標檔案使用隱含規則來重建,則它代表由隱含規則加入的第一個依賴檔案。

$?

所有比目標檔案更新的依賴檔案列表,空格分割。如果目標是靜態庫檔名,代表的是庫成員(.o檔案)。

$^

規則的所有依賴檔案列表,使用空格分隔。如果目標是靜態庫檔案,它所代表的只能是所有庫成員(.o檔案)名。一個檔案可重複的出現在目標的依賴中,變數“

$^”只記錄它的一次引用情況。就是說變數“$^”會去掉重複的依賴檔案。

$+

類似“$^”,但是它保留了依賴檔案中重複出現的檔案。主要用在程式連結時庫的交叉引用場合。

$*

在模式規則和靜態模式規則中,代表“莖”。“莖”是目標模式中“%”所代表的部分(當檔名中存在目錄時,“莖”也包含目錄(斜槓之前)部分)。例如:檔案“dir/a.foo.b”,當目標的模式為“a.%.b”時,“$*”的值為“dir/a.foo”。“莖”對於構造相關檔名非常有用。

自動化變數“$*”需要兩點說明:

?        對於一個明確指定的規則來說不存在“莖”,這種情況下“$*”的含義發生改變。此時,如果目標檔名帶有一個可識別的字尾,那麼“$*”表示檔案中除字尾以外的部分。例如:“foo.c”則“$*”的值為:“foo”,因為.c是一個可識別的檔案字尾名。GUN make對明確規則的這種奇怪的處理行為是為了和其它版本的make相容。通常,在除靜態規則和模式規則以外,明確指定目標檔案的規則中應該避免使用這個變數。

?        當明確指定檔名的規則中目標檔名包含不可識別的字尾時,此變數為空。

自動化變數“$?”在顯式規則中也是非常有用的,使用它規則可以指定只對更新以後的依賴檔案進行操作。例如,靜態庫檔案“libN.a”,它由一些.o檔案組成。這個規則實現了只將更新後的.o檔案加入到庫中:

lib: foo.o bar.o lose.o win.o

ar r lib $?

以上羅列的自動量變數中。其中有四個在規則中代表檔名([email protected]$<$%$*)。而其它三個的在規則中代表一個檔名列表。GUN make中,還可以通過這七個自動化變數來獲取一個完整檔名中的目錄部分和具體檔名部分。在這些變數中加入“D”或者“F”字元就形成了一系列變種的自動環變數。這些變數會出現在以前版本的make中,在當前版本的make中,可以使用“dir”或者“notdir”函式來實現同樣的功能。

$(@D)

表示目標檔案的目錄部分(不包括斜槓)。如果“[email protected]”是“dir/foo.o”,那麼“$(@D)”的值為“dir”。如果“[email protected]”不存在斜槓,其值就是“.”(當前目錄)。注意它和函式“dir的區別!

$(@F)

目標檔案的完整檔名中除目錄以外的部分(實際檔名)。如果“[email protected]”為“dir/foo.o”,那麼“$(@F)”只就是“foo.o”。“$(@F)”等價於函式“$(notdir [email protected])”。

$(*D)

$(*F)

分別代表目標“莖”中的目錄部分和檔名部分。

$(%D)

$(%F)

當以如“archive(member)”形式靜態庫為目標時,分別表示庫檔案成員“member”名中的目錄部分和檔名部分。它僅對這種形式的規則目標有效。

$(<D)

$(<F)

分別表示規則中第一個依賴檔案的目錄部分和檔名部分。

$(^D)

$(^F)

分別表示所有依賴檔案的目錄部分和檔案部分(不存在同一檔案)。

$(+D)

$(+F)

分別表示所有依賴檔案的目錄部分和檔案部分(可存在重複檔案)。

$(?D)

$(?F)

分別表示被更新的依賴檔案的目錄部分和檔名部分。

在討論自動化變數時,為了和普通變數(如:“CFLAGS”)區別,我們直接使用了“$<”的形式。這種形式僅僅是為了和普通變數進行區別,沒有別的目的。其實對於自動環變數和普通變數一樣,代表規則第一個依賴檔名的變數名實際上是“<”,我們完全可以使用“$(<)”來替代“$<”。但是在引用自動化變數時通常的做法是“$<”,因為自動化變數本身是一個特殊字元。

GUN make同時支援“Sysv”特性,允許在規則的依賴列表中使用特殊的變數引用(一般的自動化變數只能在規則的命令列中被引用)“[email protected]”、“$$(@D)”和“$$(@F)”(注意:要使用“$$”),它們分別代表了“目標的完整檔名”、“目標檔名中的目錄部分”和“目標的實際檔名部分”。這三個特殊的變數只能用在明確指定目標檔名的規則中或者是靜態模式規則中,不用於隱含規則中。另外Sysv makeGNU make對規則依賴的處理也不盡相同。Sysv make對規則的依賴進行兩次替換展開,而GUN make對依賴列表的處理只有一次,對其中的變數和函式引用直接進行展開。

自動化變數的這個古怪的特性完全是為了相容Sysv 版本的makefile檔案。在使用GNU make時可以不考慮這個,也可以在Makefile中使用偽目標“.POSIX”來禁止這一特性。

相關推薦

shell指令碼makefile特殊變數

shell指令碼中的特殊變數 1. $# 傳遞到指令碼的引數個數 2. $* 以一個單字串顯示所有向指令碼傳遞的引數。與位置變數不同,此選項引數可超過9個3. $$ 指令碼執行的當前程序ID號4. $! 後臺執行的最後一個程序的程序ID號5. [email p

makefile 特殊變數的使用

1.源程式的編譯 在Linux下面,如果要編譯一個C語言源程式,我們要使用GNU的gcc編譯器。 下面我們以一個例項來說明如何使用gcc編譯器。 假設我們有下面一個非常簡單的源程式(hello.c): int main(int argc,char **argv) { pri

詳解CentOS定時執行釋放記憶體的Shell指令碼相關原理

本文由荒原之夢原創,原文連結:http://zhaokaifeng.com/?p=748 本文總體結構: 第一部分:本文中釋放系統記憶體的原理 第二部分:建立用於釋放記憶體的Shell指令碼並加入到系統定時任務 第三部分:詳細分析Shell指令碼中的每一條指令 第四部

Makefile變數shell變數

我們在寫makefile時 多多少少會用到shell指令碼, 對於變數的在shell中的使用有一些要注意的細節。讓我們從一個簡單的makefile來看看。 注意makefile中一定要有一個目標,且一

通用 Makefilemakefile的notdir,wildcard和patsubst)

and har alt table free modify sources follow rul notdir,wildcard和patsubst是makefile中幾個有用的函數,以前沒留意過makefile中函數的用法,今天稍微看看~ 1、makefile裏的函數

shell 指令碼替換檔案的某個字串

1、將當前目錄下包含"qwe"串的檔案中的"qwe"字串替換為"abc" sed -i “s/qwe/abc/g” grep "qwe" -rl ./ 2、將某個檔案中的"qwe"字串替換為"abc" sed -i “s/qwe/abc/g” test.txt 如果將某個檔案

【三】makefile變數

一、變數賦值 直接展開式 := 特點:在定義時立即展開應用的變數 示例: value1 := 5 value2 := $(value1) #value2會立即被賦值成5 value1 :=6 var-test: @echo "value2", $(value2)

shell指令碼學習第三彈-變數的使用

shell指令碼學習第三彈-變數的使用 一、什麼是變數 相信大家聽到變數這個詞語很敏感吧,我們的C語言中也有所謂的變數,變數即在程式執行過程中它的值是允許改變的量。 也可以這麼說,變數的本質是一種鍵值對,舉個例子來說:str=“123456”,“12345”就是鍵值對中的Val

shell指令碼第一行使用環境變數

Shell 既是一種指令碼程式語言,也是一個連線核心和使用者的軟體。 常見的 Shell 有 sh、bash、csh、tcsh、ash 等。 在Linux的一些腳本里,需在開頭一行指定指令碼的解釋程式,如: #!/usr/bin/env Python 再如: #!/us

shell指令碼expect命令send特殊字元

http://expect.sourceforge.net/FAQ.html#q54 可以用od命令檢視要傳送的字元, 1. od -c 2.輸入字元,如ctrl+],回車 3.ctrl+D 螢幕會顯示如下內容: ^] 0000000 035  \n 0000002 其

利用shell指令碼監控linuxCPU、記憶體和磁碟利用率。(centos7)

  這篇部落格中所寫的,在實際工作中並沒有什麼卵用,工作中並不會用到這種指令碼去監控。不過自己寫一遍,可以讓初學者對CPU、記憶體、磁碟等一些基礎知識和基礎命令更加了解。 1、利用vmstat工具監控CPU詳細資訊,然後基於/proc/stat計算CPU利用率進行監控,超過80報警並提取出佔用cpu最高的前十

控制shell指令碼執行頻率、解決shell指令碼不能修改環境變數等問題

問題描述:這幾天室友遇到一個麻煩,他寫的一個shell指令碼在事件觸發時總是被執行多次而出錯,他想要控制指令碼的執行次數,即每次觸發僅執行一次就行了。懶得去研究為什麼被多次觸發,希望僅僅在指令碼內部寫幾行程式碼便解決這個問題。下面我向大家介紹一下我想的一種解決辦法。 解決辦

Makefile變數

Makefile中變數有以下幾個特徵: 1. Makefile中變數和函式的展開(除規則命令列中的變數和函式以外),是在make讀取makefile檔案時進行的,這裡的變數包括了使用“=”定義和使用指示符“define”定義的。 2. 變數可以用來代表一個檔名列表、編譯選項列表、程式執行的選項引數列表、搜尋

使用shell指令碼統計檔案ip出現的次數

首先準備檔案demo.txt,內容如下: 1 192.168.41.20 2 192.168.41.21 3 192.168.41.22 4 192.168.41.23 5 192.168.41.24 6 192.168.41.25 統

thymeleafjshtml特殊符號的轉義問題

html中如果你寫了一個這樣的語句: <h5>上傳檔案地址:${fileUrl}</h5> 其效果是當model中取到了fileUrl則會顯示具體內容,但沒有值的時候也顯示出${fileUrl},並不妥當。 這時候你改成如下的語句問題就解決了: &l

shell指令碼統計檔案單詞的個數

一、方案  http://www.cnblogs.com/youxuguang/p/5917215.html 方法一: (1)cat file|sed 's/[,.:;/!?]/ /g'|awk '{for(i=1;i<=NF;i++)array[$i]++;}END{for(i in array)

makefile特殊變數,類似[email protected], $+等 (copied)

來源:http://hi.baidu.com/jingweiyoung/item/dea74399c40eb24cf14215cf Makefile 特殊變數 常用特殊變數 例: %.o:%.c           ¥(CC) -c $(CFLAGS) $&l

Makefile引用變數時大括號和小括號有啥區別?

如題。 Makefile中可以通過$(Var)或者${Var}的方式引用變數"Var", 我想問一下大括號應用跟小括號引用有啥區別?我有碰到過一個問題,通過小括號在某些情況下引用環境變數一直失敗,但大括號就可以,望各位達人給個正解,謝謝!------解決方案--------

MakeFile變數定義

   一般在我們書寫Makefile時,各部分變數引用的格式我們建議如下:1. make變數(Makefile中定義的或者是make的環境變數)的引用使用“$(VAR)”格式。 2. 出現在規則命令列中shell變數(一般為執行命令過程中的臨時變數,它不屬於Makefile變

shell的位置引數和特殊變數

shell中有很多自動複製的變數 常用的位置引數和特殊變數有 $0       相當於C語言main函式的argv[0] $1 $2 $3....位置引數,相當於argv[1],argv[2],argv[3] $#       相當於argv -1 [email&