shell腳本編程基礎(chǔ)

本文轉(zhuǎn)自 http://mprc.pku.edu.cn/mentors/training/TrainingCourses/material/ShellProgramming.HTM#_Toc37518063
七種文件類型

正則表達(dá)式

字符類描述

shell的引號(hào)類型

變量設(shè)置時(shí)的不同模式:

條件測(cè)試

命令執(zhí)行順序

腳本調(diào)試

一些常用的小TRICK

打印一些頭信息

創(chuàng)建一個(gè)長(zhǎng)度為0的空文件

一些常用的shell變量

$0的使用

Shift的運(yùn)用

用head或tail指令指定查閱的行數(shù)

AWK使用規(guī)則

第一個(gè) awk

多個(gè)字段

外部腳本

BEGIN 和 END 塊

規(guī)則表達(dá)式和塊

條件語(yǔ)句

數(shù)值變量

字符串化變量

眾多運(yùn)算符

字段分隔符

字段數(shù)量

記錄號(hào)

多行記錄

OFS 和 ORS

將多行轉(zhuǎn)換成用 tab 分隔的格式

循環(huán)結(jié)構(gòu)

for 循環(huán)

break 和 continue

數(shù)組下標(biāo)字符串化

數(shù)組工具

格式化輸出

字符串函數(shù)

一些更耐人尋味的函數(shù)

字符串替換

特殊字符串形式

SED使用規(guī)則

sed 示例

另一個(gè) sed 示例

地址范圍

帶規(guī)則表達(dá)式的地址

有關(guān)地址的更多內(nèi)容

替換

規(guī)則表達(dá)式混亂

更多字符匹配

高級(jí)替換功能

組合使用

一個(gè)地址的多個(gè)命令

附加、插入和更改行

使用 sed 的幾個(gè)示例

LINUX常用腳本和函數(shù)

LINUX常用命令

關(guān)于文件/目錄處理的指令:

關(guān)于 Process 處理的指令:

關(guān)于字符串處理的指令:

聯(lián)機(jī)查詢的指令:

網(wǎng)絡(luò)運(yùn)用指令:

VI常用技巧

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)用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一.編程基本概念 編程邏輯處理方式: 順序執(zhí)行 循環(huán)執(zhí)行 選擇執(zhí)行 ?shell編程:過(guò)程式、解釋執(zhí)行編程語(yǔ)言的基...
    楠人幫閱讀 1,438評(píng)論 0 1
  • 程序:什么是程序 程序是指令加數(shù)據(jù)來(lái)組合來(lái)完成 真正關(guān)心的是對(duì)數(shù)據(jù)的處理,通過(guò)指令對(duì)數(shù)據(jù)的操作 程序編程風(fēng)格 在程...
    數(shù)據(jù)革命閱讀 504評(píng)論 0 0
  • 一、編程基礎(chǔ)概念: 程序編程風(fēng)格:面向過(guò)程:以指令為中心,數(shù)據(jù)服務(wù)于指令,適于開(kāi)發(fā)小型程序面向?qū)ο螅阂詳?shù)據(jù)為中心,...
    哈嘍別樣閱讀 577評(píng)論 0 2
  • 一、退出狀態(tài) 進(jìn)程通過(guò)退出狀態(tài)報(bào)告進(jìn)程運(yùn)行成功或失敗 echo $?查看上一條命令執(zhí)行的退出狀態(tài) 0代表運(yùn)行成功,...
    哈嘍別樣閱讀 335評(píng)論 0 1
  • 1、bash、source和給執(zhí)行權(quán)限后打開(kāi)腳本有什么區(qū)別? 總結(jié):bash和絕對(duì)路徑及相對(duì)路徑打開(kāi)腳本時(shí)開(kāi)了一個(gè)...
    張大志的博客閱讀 352評(píng)論 0 0

友情鏈接更多精彩內(nèi)容