日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Makefile和shell脚本调用上的一些总结

發(fā)布時間:2023/12/18 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Makefile和shell脚本调用上的一些总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

大家都知道在Makefile可以調(diào)用shell腳本,但是Makefile和shell腳本是不同的。本文試著介紹一下Makefile和shell腳本的不同。

1、在Makefile中只能在target中調(diào)用Shell腳本,其他地方是不能輸出的。比如如下代碼就是沒有任何輸出:

VAR="Hello"?

echo "$VAR"?

?all: .....

以上代碼任何時候都不會輸出,沒有在target內(nèi),如果上述代碼改為如下:

VAR="Hello"?

?all:?

?? ? ? echo "$VAR" .....

以上代碼,在make all的時候?qū)?zhí)行echo命令。

2、在Makefile中執(zhí)行shell命令,一行創(chuàng)建一個進程來執(zhí)行。這也是為什么很多Makefile中有很多行的末尾都是“;? \”,以此來保證代碼是一行而不是多行,這樣Makefile可以在一個進程中執(zhí)行,例如:

SUBDIR=src example?

all:?

?? ? ?@for subdir in $(SUBDIR); \?

?? ???do\?

?? ? ? echo "building "; \?

?? ? ? done

上述可以看出for循環(huán)中每行都是以”; \”結(jié)尾的。

3、Makefile中所有以$打頭的單詞都會被解釋成Makefile中的變量。如果你需要調(diào)用shell中的變量(或者正則表達式中錨定句位$),都需要加兩個$符號($$)。實例如下:

PATH="/data/"?

?all:?

?? ? echo ${PATH}?

?? ? echo $$PATH

例子中的第一個${PATH}引用的是Makefile中的變量,而不是shell中的PATH環(huán)境變量,后者引用的事Shell中的PATH環(huán)境變量。

???? 以上三點的是Makefile調(diào)用shell應(yīng)該注意的地方,寫Makefile一定要注意。

?

shell腳本條件判斷

?

UNIX Shell 編程中條件判斷是極為重要的,以下是常用的條件判斷:

-b file 若文件存在且是一個塊特殊文件,則為真
-c file 若文件存在且是一個字符特殊文件,則為真
-d file 若文件存在且是一個目錄,則為真
-e file 若文件存在,則為真
-f file 若文件存在且是一個規(guī)則文件,則為真
-g file 若文件存在且設(shè)置了SGID位的值,則為真
-h file 若文件存在且為一個符合鏈接,則為真
-k file 若文件存在且設(shè)置了”sticky”位的值
-p file 若文件存在且為一已命名管道,則為真
-r file 若文件存在且可讀,則為真
-s file 若文件存在且其大小大于零,則為真
-u file 若文件存在且設(shè)置了SUID位,則為真
-w file 若文件存在且可寫,則為真
-x file 若文件存在且可執(zhí)行,則為真
-o file 若文件存在且被有效用戶ID所擁有,則為真

-z string 若string長度為0,則為真
-n string 若string長度不為0,則為真
string1 = string2 若兩個字符串相等,則為真
string1 != string2 若兩個字符串不相等,則為真

int1 -eq int2 若int1等于int2,則為真
int1 -ne int2 若int1不等于int2,則為真
int1 -lt int2 若int1小于int2,則為真
int1 -le int2 若int1小于等于int2,則為真
int1 -gt int2 若int1大于int2,則為真
int1 -ge int2 若int1大于等于int2,則為真

!expr 若expr為假則復(fù)合表達式為真。expr可以是任何有效的測試表達式
expr1 -a expr2 若expr1和expr2都為真則整式為真
expr1 -o expr2 若expr1和expr2有一個為真則整式為真

特殊變量

$0 正在被執(zhí)行命令的名字。對于shell腳本而言,這是被激活命令的路徑
$n 該變量與腳本被激活時所帶的參數(shù)相對應(yīng)。n是正整數(shù),與參數(shù)位置相對應(yīng)($1,$2…)
$# 提供腳本的參數(shù)號
$* 所有這些參數(shù)都被雙引號引住。若一個腳本接收兩個參數(shù),$*等于$1$2
$@ 所有這些參數(shù)都分別被雙引號引住。若一個腳本接收到兩個參數(shù),$@等價于$1$2
$? 前一個命令執(zhí)行后的退出狀態(tài)
$$ 當前shell的進程號。對于shell腳本,這是其正在執(zhí)行時的進程ID
$! 前一個后臺命令的進程號

?

Shell函數(shù)
mylog() {

??? echo "[`date '+%F %T'`] [ $2.$1 ] $3" >> $4
}

s_time=`date +%s`
s_curren_dir=$(pwd)
s_logfile=$s_curren_dir/log/install.log.`date '+%Y%m%d'`
logID=001
mylog "$s_time" "$logID" "your messager." "$s_logfile" #shell腳本中函數(shù)的調(diào)用不能用(),并且參數(shù)使用空格分隔,不是符合一般的習慣

?

?在這自定義函數(shù)我沒試過,操一段

其實定義起來很簡單, 沒有我想象中的 def, command, function 之類的關(guān)鍵字, 而是等同于變量定義, 下面是嘗試在實際項目中使用的函數(shù)定義:

[zrf@DMLinux pes]$ cat Makefile.common
# The following function make the input token uniq.
# the token may be not in the input order
# usage: uniq_result=$(call uniq, A B A B B C)
# expected result: uniq_result is A B C
uniq=$(shell echo $1 | sed 's/[ \t]\+/\n/g' | sed 's/^/ /' | sort -u | tr -d '\n')

# The following function link the -lnet* and -lwrap library statically while
# keep other libraries being link dynamically by wrapping the -lxxx option with
# -Wl,-Bstatic ... -Wl,-Bdynamic
link_some_lib_staticlly=$(shell echo $1 | sed 's/-l\(net[^ \t]*\|wrap\)\( -l\(net[^ \t]*\|wrap\)\)*/-Wl,-Bstatic & -Wl,-Bdynamic/g')

自定義函數(shù)的關(guān)鍵是一定要用=號, 而不是:=, :=與=的差別是:=是即時求值, =則是使用時才求值. 把:看作一個站著的小人, :=可以看作"立等可取"來助記.

命令定義中可以用$1, $2, $3來引用傳遞的參數(shù), 注釋里已經(jīng)有了自定義函數(shù)的使用
call是個特殊的make函數(shù), 用于調(diào)用其它函數(shù), 參數(shù)以逗號分隔.

借助這種方法, 可以讓那些頻繁而又重復(fù)的操作被封裝進一個函數(shù)里, 不需要到處復(fù)制, DRY遠處不在.

上面這兩個自定義函數(shù)的功能是:
讓 LDLIBS這樣的變量中內(nèi)容精簡, 同時能靈活地指定某個庫是以靜態(tài)方式鏈接到最終可執(zhí)行文件里, 而多數(shù)其它的常用庫, 如libc仍保持是動態(tài)鏈接.自:http://blog.chinaunix.net/u/8681/showart_2228861.html

轉(zhuǎn)載于:https://www.cnblogs.com/yxw5/p/3383798.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的Makefile和shell脚本调用上的一些总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。