在Linux系統(tǒng)中,Shell是一個非常靈活的工具。Shell不僅能夠執(zhí)行命令,而且是一門非常優(yōu)秀的編程語言贮乳。
一、Shell編程基礎(chǔ)
通過使用Shell編程可以使大量的任務(wù)自動化恬惯,Shell程序特別擅長系統(tǒng)管理任務(wù)向拆,尤其適合那些易用性、可維護性和便攜性比效率更重要的任務(wù)酪耳。
1浓恳、Shell腳本概述
Shell腳本程序是Shell命令語句的集合(內(nèi)部命令和外部命令),用于實現(xiàn)特定的功能葡兑,Shell腳本程序保存在文本文件中奖蔓,可以使用文本處理程序閱讀和編輯(例如gedit或vi/vim)赞草。
Linux系統(tǒng)中的Shell腳本通常具備以下特點:
- Shell腳本程序是由Shell環(huán)境解釋執(zhí)行的讹堤;
- Shell腳本不需要編譯、鏈接及生成可執(zhí)行文件厨疙,直接由相應(yīng)的解釋器解釋執(zhí)行即可洲守;
- 執(zhí)行Shell程序時,Shell腳本文件需要具有可執(zhí)行的權(quán)限沾凄;
- Shell腳本可以使用變量梗醇、控制語句等比較復(fù)雜的結(jié)構(gòu);
- Shell腳本是從上而下撒蟀、順序執(zhí)行的叙谨。
2、創(chuàng)建Shell腳本
直接使用文本編輯程序vim即可創(chuàng)建和編寫Shell腳本程序手负。
xuqing@master: ~ $ vim hello.sh #創(chuàng)建Shell腳本
xuqing@master: ~ $ chmod u+x hello.sh #賦予其可執(zhí)行權(quán)利
xuqing@master: ~ $ ./hello.sh #執(zhí)行腳本
也可以執(zhí)行以下命令,兩者是等價的姑尺。
xuqing@master: ~ $ vim hello.sh #創(chuàng)建Shell腳本
xuqing@master: ~ $ bash hello.sh #利用bash命令直接解釋執(zhí)行腳本
Shell腳本同Linux系統(tǒng)中的其他文件一樣,可以不使用擴展名统捶。但是為了方便識別喘鸟,通常建議Bash腳本文件名以sh結(jié)尾迷守,Tcsh腳本文件以csh結(jié)尾凯力。
#!/bin/bash
#This is a test script
#This script will output hello
echo "hello!"
exit 0
- `#!/bin/bash咐鹤,文件第一行的內(nèi)容是告訴系統(tǒng)使用哪種Shell來解釋執(zhí)行此腳本中的肉容,本例中使用的是Bash圣絮。
- `#This is a test script祈惶,腳本注釋行。
- echo "hello!" 扮匠,命令行捧请。
- exit 0,該命令用來結(jié)束腳本棒搜,該命令也會返回一個值來傳遞給父進程疹蛉,一般情況下,成功則返回0力麸,非0表示一個錯誤碼可款。
3、Shell編程語法
Shell程序本質(zhì)上也是一種結(jié)構(gòu)化程序克蚂,掌握Shell編程的基礎(chǔ)就是熟練使用其編程語法闺鲸。Shell編程語法主要包括變量、函數(shù)埃叭、控制結(jié)構(gòu)摸恍,以及相關(guān)的Shell命令等。
3.1 變量
在Shell里赤屋,變量具有以下特點:
- 在使用變量之前并不需要聲明立镶,而是通過使用(賦值=左右沒有空格)變量來創(chuàng)建;
- 在默認情況下益缎,所有的變量都是作為字符串進行存儲谜慌;
- 變量名區(qū)分大小寫;
- 通過在變量名前面加一個$符號來訪問它的內(nèi)容莺奔;
3.2 echo命令
echo命令其作用是顯示一行文本欣范。其常用的語法格式如下:
echo [option] [string]
- “-n”变泄,指示echo命令不輸出行尾的換行符;
3.2.1 set命令
set命令作用主要是顯示系統(tǒng)中已經(jīng)存在的shell變量恼琼,以及設(shè)置shell變量的新變量值妨蛹。使用set更改shell特性時,符號"+"和"-"的作用分別是打開和關(guān)閉指定的模式晴竞。set命令不能夠定義新的shell變量蛙卤。如果要定義新的變量,可以使用declare命令以變量名=值
的格式進行定義即可噩死。其常用的語法格式如下:
set(選項)(參數(shù))
- declare mylove='Visual C++' #定義新環(huán)境變量
- set -a mylove #設(shè)置為環(huán)境變量
- env | grep mylove #顯示環(huán)境變量值
3.2.2 alias命令
alias命令用來設(shè)置指令的別名颤难。其常用的語法格式如下:
alias 新的命令='原命令 -選項/參數(shù)'
3.3 read命令
可以使用read命令將用戶的輸入賦值給一個變量。
xuqing@master: ~ $ read foo
test
xuqing@master: ~ $ echo $foo
test
3.4 引號的使用
一般情況下已维,Shell腳本中的參數(shù)以空白字符隔開行嗤。如果要在一個參數(shù)中包含一個或多個空白字符,必須給參數(shù)加上引號垛耳。
“$foo”栅屏,雙引號,會用變量替換它的值堂鲜;
‘$foo’栈雳,單引號,不會發(fā)生替換行為缔莲;
-
$foo哥纫,取消變量的特殊含義;
以下腳本variable.sh#!/bin/bash myvar="Hi here"; echo $myvar echo "$myvar" echo "'$myvar'" //這里你會發(fā)現(xiàn)加了雙引號以后'$myvar'仍然被識別為一個字符串 echo '$myvar' echo \$myvar echo "Enter some text" read myvar echo '$myvar' now equals $myvar exit 0
執(zhí)行的結(jié)果如下:
xuqing@master: ~ $ bash varible.sh
Hi here
Hi here
Hi here
$myvar
$myvar
Enter some text
hello
$myvar now equals hello
3.5 使用$(command)語法
編寫腳本程序時酌予,經(jīng)常需要捕獲一條命令的執(zhí)行結(jié)果磺箕,例如把命令的輸出放到一個變量中奖慌,這時可以使用$(command)語法來實現(xiàn)抛虫。
例如:test.sh
#!/bin/bash
echo the current directory is $(pwd)
thisdate=$(date)
echo the current data is $thisdate
exit 0
運行的結(jié)果:
xuqing@master: ~ $ bash test.sh
the current directory is /home/xuqing
....
4、環(huán)境變量
環(huán)境變量是給Linux系統(tǒng)或用戶程序設(shè)置的一些參數(shù)简僧,其作用和具體的環(huán)境變量相關(guān)建椰,例如:PATH存儲了系統(tǒng)常用命令所在的目錄,HOME存儲的是當(dāng)前用戶的目錄岛马。
當(dāng)一個Shell腳本程序開始執(zhí)行時棉姐,一些變量會根據(jù)環(huán)境設(shè)置中的值進行初始化。用戶可以在Shell腳本程序中像引用自己定義的變量一樣用$引用它們啦逆。
- $PATH伞矩,以冒號分割,通常用來搜索命令的目錄列表夏志;
- $HOME乃坤,當(dāng)前用戶的主目錄;
- $0,Shell腳本程序的名字湿诊;
- $#狱杰,傳遞給腳本的參數(shù)個數(shù),如果腳本程序在調(diào)用時沒有傳遞任何參數(shù)厅须,則其值是0仿畸;
- $IFS,輸入域分隔符朗和。當(dāng)Shell讀取輸入時错沽,它給出用來分隔單詞的一組字符,通常是空格眶拉、制表符和換行符等甥捺。
4.1 參數(shù)變量
如果腳本程序在調(diào)用時帶有參數(shù),一些額外的參數(shù)變量會被創(chuàng)建镀层。
- 1镰禾,2...,腳本程序調(diào)用時傳遞過來的參數(shù)唱逢;
- $*吴侦,在一個變量中列出所有的參數(shù),各參數(shù)之間用空格分隔開坞古;
4.2 設(shè)置參數(shù)變量
set命令的作用是為Shell設(shè)置參數(shù)變量备韧。許多命令的輸出結(jié)果是以空格分隔的值,如果需要使用輸出結(jié)果中的某個域痪枫,就可以用到set命令织堂,其語法格式如下:
set $(command)
#!/bin/bash
echo "the current date is $(date)"
set $(date)
echo "the current month is $2"
exit 0
5、條件
在Shell腳本中奶陈,可以使用if/then結(jié)構(gòu)對條件進行測試判斷易阳,并根據(jù)測試結(jié)果采取不同的執(zhí)行流程。
在實際工作中吃粒,大多數(shù)腳本程序都會廣泛使用Shell的布爾判斷命令“[”潦俺,或“test”來實現(xiàn)測試。為了增強可讀性徐勃,當(dāng)使用“[”命令時事示,還是用“[”來結(jié)尾。
注意:必須在“[”和被檢查的條件之間留出空格僻肖。這與test命令時一樣的肖爵,因為test命令之后總是有一個空格。
test命令能夠使用的條件類型可以歸為4類:字符串比較臀脏,算術(shù)比較劝堪、邏輯運算與文件有關(guān)的條件測試法挨。
5.1分支語句
- if-then
- for
- while
- until
- break
- case
6、函數(shù)
Shell允許將一組命令集或語句形成一個可用塊幅聘,這些塊稱為Shell函數(shù)凡纳。函數(shù)由兩部分組成:函數(shù)標題和函數(shù)體。標題是函數(shù)名帝蒿,函數(shù)名在當(dāng)前Shell腳本中應(yīng)該唯一荐糜;函數(shù)體是函數(shù)內(nèi)的命令集合。
#!/bin/bash
fun()
{
echo "Function is executing"
}
echo "ready call"
fun
echo "call end"
exit 0
6.1 退出和返回值
執(zhí)行完畢后自動退出葛超,也可以使用return語句在執(zhí)行過程中提前退出暴氏。
return [value]
value 可選是整數(shù)值,一般情況下使用0表示函數(shù)執(zhí)行成功绣张,非0表示出錯代碼答渔。函數(shù)的退出值使用“$?”獲得。
6.2 參數(shù)傳遞
在函數(shù)內(nèi)部侥涵,與傳遞給Shell腳本參數(shù)一樣沼撕,通過“1、2...”來獲取傳遞進來的參數(shù)芜飘。
#!/bin/bash
fun()
{
echo "the first parameter is $1"
echo "the second parameter is $2"
return 0
}
fun "123" "456"
if [ $? = 0]
then
echo "fun execute success"
else
echo "fun execute faliure"
fi
exit 0