本文轉(zhuǎn)自 http://mprc.pku.edu.cn/mentors/training/TrainingCourses/material/ShellProgramming.HTM#_Toc37518063
七種文件類型
創(chuàng)建一個(gè)長(zhǎng)度為0的空文件
Shell腳本編程的常識(shí)
七種文件類型
d 目錄
l 符號(hào)鏈接
s 套接字文件
b 塊設(shè)備文件
c 字符設(shè)備文件
p 命名管道文件
- 普通文件
正則表達(dá)式
從一個(gè)文件或命令輸出中抽取或過(guò)濾文本時(shí)。可使用正則表達(dá)式(RE),正則表達(dá)式是一些特殊或不很特殊的字符串模式的集合。
** 基本的元字符集:**
^ 只匹配行首。
$ 只匹配行尾。
* 一個(gè)單字符后緊跟*,匹配0個(gè)或多個(gè)此單字符。
[] 匹配[]內(nèi)字符,可以是一個(gè)單字符,也可以是字符序列??梢允褂?來(lái)表示[]內(nèi)范圍,如[1-5]等價(jià)于[1,2,3,4,5]。
\ 轉(zhuǎn)義字符,屏蔽一個(gè)元字符的特殊含義,如\$表示字符$,而不表示匹配行尾。
. 匹配任意單字符。
pattern\{n\} 匹配pattern出現(xiàn)的次數(shù)n
pattern\{n,\} 匹配pattern出現(xiàn)的次數(shù),但表示次數(shù)最少為n
pattern\{n,m\} 匹配pattern出現(xiàn)的次數(shù)在n與m之間(n,m為0-255)
幾個(gè)常見(jiàn)的例子:
顯示可執(zhí)行的文件: ls –l | grep …x...x..x
只顯示文件夾: ls –l | grep ^d
匹配所有的空行: ^$
匹配所有的單詞: [A-Z a-z]*
匹配任一非字母型字符: [^A-Z a-z]
包含八個(gè)字符的行: ^……..$(8個(gè).)
字符類描述
以下是可用字符類的相當(dāng)完整的列表:
[:alnum:] 字母數(shù)字 [a-z A-Z 0-9]
[:alpha:] 字母 [a-z A-Z]
[:blank:] 空格或制表鍵
[:cntrl:] 任何控制字符
[:digit:] 數(shù)字 [0-9]
[:graph:] 任何可視字符(無(wú)空格)
[:lower:] 小寫 [a-z]
[:print:] 非控制字符
[:punct:] 標(biāo)點(diǎn)字符
[:space:] 空格
[:upper:] 大寫 [A-Z]
[:xdigit:] 十六進(jìn)制數(shù)字 [0-9 a-f A-F]
盡可能使用字符類是很有利的,因?yàn)樗鼈兛梢愿玫剡m應(yīng)非英語(yǔ) locale(包括某些必需的重音字符等等).
shell的引號(hào)類型
shell共有四種引用類型:
“” 可引用除 $、` 、\ 、外的任意字符或字符串,“ ”中的變量能夠正常顯示變量值。
‘’ 與“ ”類似,不同在于shell會(huì)忽略任何的引用值。
例如: GIRL=‘girl’
echo “The ‘$GIRL’ did well”
則打印:The ‘girl’ did well
`` 用于設(shè)置系統(tǒng)命令的輸出到變量,shell會(huì)將``中的內(nèi)容作為一個(gè)系統(tǒng)命令并執(zhí)行質(zhì)。
例如:echo `date` 則打印當(dāng)前的系統(tǒng)時(shí)間。
\ 轉(zhuǎn)義字符,用來(lái)屏蔽特殊含義的字符:& * + ^ $ ` “ | ?
例如:expr 12 \* 12 將輸出144
單引號(hào)和雙引號(hào)都能關(guān)閉shell對(duì)特殊字符的處理。不同的是,雙引號(hào)沒(méi)有單引號(hào)嚴(yán)格,單引號(hào)關(guān)閉所有有特殊作用的字符,而雙引號(hào)只要求shell忽略大多數(shù),具體的說(shuō),就是①美元符號(hào)②反引號(hào)③反斜杠,這3種特殊字符不被忽略。 不忽略美元符號(hào)意味著shell在雙引號(hào)內(nèi)部也進(jìn)行變量名替換。
變量設(shè)置時(shí)的不同模式:
valiable_name=value 設(shè)置實(shí)際值到 variable_name中
valiable_name+value 如果設(shè)置了variable_name,則重設(shè)其值
valiable_name:?value 如果未設(shè)置variable_name,則先顯示未定義用戶錯(cuò)誤信息
valiable_name?value 如果未設(shè)置variable_name,則顯示系統(tǒng)錯(cuò)誤信息
valiable_name:=value 如果未設(shè)置variable_name,則設(shè)置其值
valiable_name-value 同上,但取值并不設(shè)置到variable_name
條件測(cè)試
test命令用于測(cè)試字符串、文件狀態(tài)和數(shù)字,expr測(cè)試和執(zhí)行數(shù)值輸出。
Test格式:test condition 或 [ condition ](需要特別注意的是condition的兩邊都要有一個(gè)空格,否則會(huì)報(bào)錯(cuò)),test命令返回0表示成功。
下面將分別描述test的三種測(cè)試:
文件狀態(tài)測(cè)試(常用的)
-d 測(cè)試是否文件夾
-f 測(cè)試是否一般文件
-L 測(cè)試是否鏈接文件
-r 測(cè)試文件是否可讀
-w 測(cè)試文件是否可寫
-x 測(cè)試文件是否可執(zhí)行
-s 測(cè)試文件是否非空
字符串測(cè)試
五種格式:
test “string”
test string_operator “string”
test “string” string_operator “string”
[ string_operator “string” ]
[ “string” string_operator “string” ]
其中string_operator可以為: = 兩字符串相等
!= 兩字符串不等
-z 空串
-n 非空串
數(shù)值測(cè)試
兩種格式:
“number” number_operator “number”
其中:number_operator 可以為:-eq 、-ne、-gt、-lt、-ge
例如: NUMBER=130
[ “990” –le “995” –a “NUMBER” -gt “133” ]
(其中-a表示前后結(jié)果相“與”)
expr命令一般用于整數(shù)值,但也可以用于字符串。
格式: expr srgument operator operator argument
例如: expr 10 + 10
expr 10 ^ 2 (10的平方)
expr $value + 10
增量計(jì)數(shù)――expr在循環(huán)中最基本的用法
例如: LOOP=0
LOOP=`expr $LOOP + 1`
模式匹配:通過(guò)指定的冒號(hào)選項(xiàng)計(jì)算字符串中的字符數(shù)
例如: value=account.doc
expr $value : `\(.*\).doc`
輸出 account
命令執(zhí)行順序
&& 成功執(zhí)行一個(gè)命令后再執(zhí)行下一個(gè)
|| 一個(gè)命令執(zhí)行失敗后再執(zhí)行另一個(gè)命令
( ) 在當(dāng)前shell中執(zhí)行一組命令(格式:(命令1;命令2; ……))
{ } 同( )
例如: comet mouth_end || ( echo “hello” | mail dave ;exit )
如果沒(méi)有( ),則shell將直接執(zhí)行最后一個(gè)命令(exit)
腳本調(diào)試
最有用的調(diào)試腳本的工具是echo命令,可以隨時(shí)打印有關(guān)變量或操作的信息,以幫助定位錯(cuò)誤。也可使用打印最后狀態(tài)($?) 命令來(lái)判斷命令是否成功,這時(shí)要注意的是要在執(zhí)行完要測(cè)試的命令后立即輸出$?,否則$?將會(huì)改變。
Set命令也可以用來(lái)輔助腳本測(cè)試:
Set –n 讀命令但是不執(zhí)行
Set –v 顯示讀取的所有的行
Set –x 顯示所有的命令及其參數(shù)
(要關(guān)閉set選項(xiàng),只要把-換成+就可以了,這里有點(diǎn)特殊,要注意一下)
一些常用的小trick
打印一些頭信息
command << dilimiter
……
……
dilimiter
以分界符號(hào)dilimiter中的內(nèi)容作為命令的標(biāo)準(zhǔn)輸入
常用在echo命令中,這樣就避免了沒(méi)輸出一行就要使用一個(gè)echo命令,同時(shí),輸出格式的調(diào)整也相應(yīng)變得簡(jiǎn)單了。
創(chuàng)建一個(gè)長(zhǎng)度為0的空文件
執(zhí)行 cat < file_name 命令或 touch file_name 命令。
一些常用的shell變量
$# 傳遞到腳本的參數(shù)個(gè)數(shù)
$* 以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù)(可大于9個(gè))
$$ 腳本運(yùn)行的當(dāng)前進(jìn)程的ID號(hào)
$! 后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的ID號(hào)
$@ 與$#相同,但使用時(shí)加引號(hào),并在引號(hào)中返回每個(gè)參數(shù)
$- 顯示shell使用的當(dāng)前選項(xiàng)
$? 顯示最后命令的退出狀態(tài),0表示無(wú)錯(cuò)誤(這個(gè)變量也常常用來(lái)打印輸出,在腳本調(diào)試時(shí)標(biāo)記某個(gè)shell命令或某個(gè)函數(shù)是否正確執(zhí)行,但是要注意,$?記載的是最近的函數(shù)或命令的退出狀態(tài),因此打印時(shí)應(yīng)該立即打印以獲得正確的信息)
$0的使用
在變量中有一種位置變量$n,用來(lái)存放函數(shù)調(diào)用或腳本執(zhí)行時(shí)傳入的參數(shù),其中$0表示函數(shù)名或腳本名,需要注意的是,這時(shí)的腳本名傳遞的是包含全路徑的腳本名。從$1-$9表示傳入的第一到第九個(gè)參數(shù),這樣的參數(shù)表示不能多于九個(gè),如果多于九個(gè),可以使用下面將要提到的shift指令來(lái)讀取。
因?yàn)?0存放函數(shù)名或腳本名,因此我們可以通過(guò)echo $0來(lái)輸出調(diào)用信息,但是,由于存放的是全路徑名,我們可以利用一個(gè)shell命令來(lái)得到腳本名,basename $0 將得到$0中名字的部分,而與之相反的,dirname $0將得到$0中路徑的部分。
Shift的運(yùn)用