在進(jìn)行l(wèi)inux測試時(shí)編寫腳本是必不可少的。最近經(jīng)常使用Linux,感覺太頻繁地敲擊鍵盤有些累了,于是想到了Shell腳本。可以把太多的命令寫成一個(gè)腳本,這樣每次執(zhí)行一遍 shell文件,就可以省去了敲擊鍵盤的時(shí)間。于是在網(wǎng)上搜了一些有關(guān)Linux下腳本編程的內(nèi)容。
Shell不僅僅是命令的收集,而且是一門非常棒的編程語言。您可以通過使用shell使大量的任務(wù)自動(dòng)化,shell特別擅長系統(tǒng)管理任務(wù),尤其適合那些易用性、可維護(hù)性和便攜性比效率更重要的任務(wù)。
用戶可以使用任何文本編輯器編輯shell腳本文件,例如VI、gedit等。
Shell腳本的名稱可以隨便定義,也不要什么后綴名,例如可以寫abc,smartzip這類名稱。
下面我們開始編寫一個(gè)Shell腳本:
1. 程序必須以下面的行開始(必須放在文件的第一行):
符號#!用來告訴系統(tǒng)它后面的參數(shù)是用來執(zhí)行該文件的程序。在這個(gè)例子中我們使用/bin/sh來執(zhí)行程序。
2. 注釋
在進(jìn)行shell編程時(shí),以#開頭的句子表示注釋,直到這一行的結(jié)束。如同其他編程語言一樣,我們在編寫腳本時(shí)也應(yīng)該盡可能地添加注釋,那么即使相當(dāng)長的時(shí)間內(nèi)沒有使用該腳本,我們也能在很短的時(shí)間內(nèi)明白該腳本的作用及工作原理。
3. 變量
在其他編程語言中您必須使用變量。在shell編程中,所有的變量都由字符串組成,并且您不需要對變量進(jìn)行聲明。要賦值給一個(gè)變量,您可以這樣寫:變量名=值
取出變量值可以加一個(gè)美元符號($)在變量前面:
#!/bin/sh
#對變量賦值:
a="hello world"
# 現(xiàn)在打印變量a的內(nèi)容:
echo "A is:"
echo $a
4. Shell命令和流程控制
在shell腳本中可以使用三類命令:
1)Unix 命令:
雖然在shell腳本中可以使用任意的unix命令,但是還是由一些相對更常用的命令。這些命令通常是用來進(jìn)行文件和文字操作的。
常用命令語法及功能
- echo "some text": 將文字內(nèi)容打印在屏幕上
- ls: 文件列表
- wc –l filewc -w filewc -c file:
- 計(jì)算文件行數(shù)計(jì)算文件中的單詞數(shù)計(jì)算文件中的字符數(shù)
- cp sourcefile destfile: 文件拷貝
- mv oldname newname : 重命名文件或移動(dòng)文件
- rm file: 刪除文件
- grep ''pattern'' file: 在文件內(nèi)搜索字符串比如:grep
- ''searchstring'' file.txt
- cut -b colnum file:指定欲顯示的文件內(nèi)容范圍,并將它們輸出到標(biāo)準(zhǔn)輸出設(shè)備比如:輸出每行第5個(gè)到第9個(gè)字符cut -b5-9 file.txt千萬不要和cat命令混淆,這是兩個(gè)完全不同的命令
- cat file.txt: 輸出文件內(nèi)容到標(biāo)準(zhǔn)輸出設(shè)備(屏幕)上
- file somefile: 得到文件類型
- read var: 提示用戶輸入,并將輸入賦值給變量
- sort file.txt: 對file.txt文件中的行進(jìn)行排序
- uniq: 刪除文本文件中出現(xiàn)的行列比如: sort file.txt | uniq
- expr: 進(jìn)行數(shù)學(xué)運(yùn)算Example: add 2 and 3expr 2 "+" 3
- find: 搜索文件比如:根據(jù)文件名搜索find . -name filename -print
- tee: 將數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出設(shè)備(屏幕) 和文件比如:somecommand | tee outfile
- basename file: 返回不包含路徑的文件名比如: basename /bin/tux將返回 tux
- dirname file: 返回文件所在路徑比如:dirname /bin/tux將返回/bin
- head file: 打印文本文件開頭幾行
- tail file : 打印文本文件末尾幾行
sed: Sed是一個(gè)基本的查找替換程序??梢詮臉?biāo)準(zhǔn)輸入(比如命令管道)讀入文本,并將結(jié)果輸出到標(biāo)準(zhǔn)輸出(屏幕)。該命令采用正則表達(dá)式(見參考)進(jìn)行搜索。不要和shell中的通配符相混淆。比如:將linuxfocus 替換為 LinuxFocus :cat text.file | sed ''s/linuxfocus/LinuxFocus/'' > newtext.fileawk: awk
用來從文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。cat file.txt | awk -F, ''{print $1 "," $3 }''這里我們使用,作為字段分割符,同時(shí)打印第一個(gè)和第三個(gè)字段。如果該文件內(nèi)容如下: AdamBor, 34, IndiaKerry Miller, 22, USA命令輸出結(jié)果為:AdamBor, IndiaKerry Miller, USA
2) 概念: 管道, 重定向和 backtick
這些不是系統(tǒng)命令,但是他們真的很重要。管道 (|) 將一個(gè)命令的輸出作為另外一個(gè)命令的輸入。
grep "hello" file.txt | wc -l
在file.txt中搜索包含有”hello”的行并計(jì)算其行數(shù)。
在這里grep命令的輸出作為wc命令的輸入。當(dāng)然您可以使用多個(gè)命令。
重定向:將命令的結(jié)果輸出到文件,而不是標(biāo)準(zhǔn)輸出(屏幕)。
> 寫入文件并覆蓋舊文件
>> 加到文件的尾部,保留舊文件內(nèi)容。
反短斜線
使用反短斜線可以將一個(gè)命令的輸出作為另外一個(gè)命令的一個(gè)命令行參數(shù)。
命令: find . -mtime -1 -type f -print 用來查找過去24小時(shí)(-mtime –2則表示過去48小時(shí))內(nèi)修改過的文件。如果您想將所有查找到的文件打一個(gè)包,則可以使用以下腳本:
#!/bin/sh
# The ticks are backticks (`) not normal quotes (''):
tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f
-print`
3) 流程控制
"if" 表達(dá)式 如果條件為真則執(zhí)行then后面的部分:
if ....; then
....
elif ....; then
....
else
....
fi
大多數(shù)情況下,可以使用測試命令來對條件進(jìn)行測試。比如可以比較字符串、判斷文件是否存在及是否可讀等等…通常用" [ ] "來表示條件測試。注意這里的空格很重要。要確保方括號的空格。
- [ -f "somefile" ] :判斷是否是一個(gè)文件
- [ -x "/bin/ls" ] :判斷/bin/ls是否存在并有可執(zhí)行權(quán)限
- [ -n "$var" ] :判斷$var變量是否有值
- [ "$a" = "$b" ] :判斷$a和$b是否相等
5. 執(zhí)行腳本 Linux下的sh文件默認(rèn)是有執(zhí)行權(quán)限的。我們可以用命令:ls -l file_name
來查看用戶對文件的權(quán)限。如果沒有執(zhí)行權(quán)限,可以執(zhí)行以下命令添加:chmod +x file_name
。然后可以通過運(yùn)行:sh XX.sh這樣的命令來運(yùn)行腳本。當(dāng)然不同的系統(tǒng)可能不完全相同,需要根據(jù)實(shí)際情況來。例如有的Linux下是./XX.sh就可以運(yùn)行。
概括地來說,shell對shell腳本的調(diào)用可以采用3種方式:
(1)一種是將文件名作為shell命令的參數(shù),其調(diào)用格式為:
當(dāng)要被執(zhí)行的腳本文件沒有可執(zhí)行權(quán)限時(shí),只能使用這種調(diào)用方式。
(2)另一種調(diào)用的方法是先將腳本文件的訪問權(quán)限更改為可執(zhí)行,以便該文件可以作為執(zhí)行文件調(diào)用。
具體的方法是:$chmod +x script_file
$PATH=$PATH:$PWD
$script_file
(3)當(dāng)執(zhí)行一個(gè)腳本文件時(shí),Shell就產(chǎn)生了一個(gè)Shell(即一個(gè)子進(jìn)程)去執(zhí)行文件中的命令。因此,腳本文件的變量值不能傳遞到當(dāng)期Shell(即父進(jìn)程)。為了使腳本文件中的變量值傳遞到當(dāng)前Shell,必須在命令文件名前面加“.”。即:
“.”命令的功能是在當(dāng)前shell中執(zhí)行腳本文件中的命令,而不是產(chǎn)生一個(gè)子shell執(zhí)行命令文件中的命令。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
您可能感興趣的文章:- Ubuntu、Linux Mint一鍵安裝Chrome瀏覽器的Shell腳本分享
- Linux下實(shí)現(xiàn)SNMP一鍵安裝的Shell腳本
- 阿里云ECS(linux)一鍵安裝web環(huán)境sh安裝步驟
- Linux一鍵安裝web環(huán)境全攻略(阿里云服務(wù)器)
- Linux中shell腳本獲取當(dāng)前工作目錄的方法
- 詳解在linxu下Svn一鍵安裝shell腳本