時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)
通常情況下,我們從命令行輸入命令每輸入一次就能夠得到系統(tǒng)的一次響應(yīng)。一旦需要我們一個接著一個的輸入命令而最后才得到結(jié)果的時候,這樣的做法顯然就沒有效率。要達(dá)到這樣的目的,通常我們利用shell程序或者shell腳本來實現(xiàn)。
一、簡介
Shell編程有很多類似C語言和其他程序語言的特征,但是又沒有編程語言那樣復(fù)雜。Shell程序就是放在一個文件中的一系列Linux命令和實用程序,在執(zhí)行的時候,通過Linux一個接著一個地解釋和執(zhí)行每個命令。方便用批量簡單命令來完成復(fù)雜的系統(tǒng)任務(wù)。
下面我們來看一個簡單的shell程序:
1、首先建立一個內(nèi)容如下的文件,名字為date,將其存放在目錄下的bin子目錄中。
#Program date
#usageto ::show the date in this way (注釋)
echo "Mr.$USER,Today is:"
echo date "+%B%d%A"
echo "Whish you a lucky day !"
2、編輯完該文件之后它還不能執(zhí)行,我們需要給它設(shè)置可執(zhí)行權(quán)限。使用如下命令:
chmod +x date
通過以上過程之后,我們就可以像使用ls命令一樣執(zhí)行這個shell程序.
[beichen@localhost bin]$ date
Mr.beichen,Today is:
January 13 Friday
Whish you a lucky day !
為了在任何目錄里都可以執(zhí)行這個程序,可以將bin的這個目錄添加到路徑中去。
[beichen@localhost bin]$ PATH=$PATH:$HOME/bin
(注:這里的$HOME代替的是/home/beichen,而bin目錄是自己建的一個目錄)
另外一種執(zhí)行date的方法就是把它作為一個參數(shù)傳給shell命令:
[beichen@localhost /]$ bash date
Mr.beichen,Today is:
January 13 Friday
Whish you a lucky day !
這樣就獲得了我們自己想要的date格式。
盡管在前面我們使用chmod +x date將date設(shè)置為可執(zhí)行,其實不設(shè)置也沒有關(guān)系,但在Linux里執(zhí)行它,需要先告訴系統(tǒng)它是一個可執(zhí)行的腳本。
[beichen@localhost /]$ .date
Mr.beichen,Today is:
January 13 Friday
Whish you a lucky day !
即在date前面加上一個點".",并且用空格與后面的shell腳本的文件名隔開。當(dāng)然,不推薦這樣做。
二、shell參數(shù)
如同ls 命令可以接受目錄等作為它的參數(shù)一樣,在shell編程時同樣可以使用參數(shù)。Shell有位置參數(shù)和內(nèi)部參數(shù)。
1、 位置參數(shù)
由系統(tǒng)提供的參數(shù)稱為位置參數(shù)。位置參數(shù)的值可以用$N得到,N是一個數(shù)字,如果為1,即$1.類似C語言中的數(shù)組,Linux會把輸入的命令字符串分段并給每段進(jìn)行標(biāo)號,標(biāo)號從0開始。第0號為程序名字,從1開始就表示傳遞給程序的參數(shù)。如$0表示程序的名字,$1表示傳遞給程序的第一個參數(shù),以此類推。
2、 內(nèi)部參數(shù)
上述過程中的$0是一個內(nèi)部變量,它是必須的,而$1則可有可無。和$0一樣的內(nèi)部變量還有以下幾個。
$# ----傳遞給程序的總的參數(shù)數(shù)目
$? ----上一個代碼或者shell程序在shell中退出的情況,如果正常退出則返回0,反之為非0值。
$* ----傳遞給程序的所有參數(shù)組成的字符串。
下面舉例進(jìn)行說明:
建立一個內(nèi)容為如下的程序P1:
echo "Program name is $0"
echo "There are totally $# parameters passed to this program"
echo "The last is $?"
echo "The parameters are $*"
執(zhí)行后的結(jié)果如下:
[beichen@localhost bin]$ P1 this is a test program //傳遞5個參數(shù)
Program name is /home/beichen/bin/P1 //給出程序的完整路徑和名字
There are totally 5 parameters passed to this program //參數(shù)的總數(shù)
The last is 0 //程序執(zhí)行結(jié)果
The parameters are this is a test program //返回有參數(shù)組成的字符串
下面我們利用內(nèi)部變量和位置參數(shù)編寫一個名為del的簡單刪除程序:
#name: del
#author: liangnian
#this program to compress a file to the dustbin
if test $# -eq 0
then
echo "Please specify a file!"
else
gzip $1 //先對文件進(jìn)行壓縮
mv $1.gz $HOME/dustbin //移動到回收站
echo "File $1 is deleted !"
fi
三、變量表達(dá)式
在上面我們編寫的小程序中我們用到了一個關(guān)鍵字test,其實它是shell程序中的一個表達(dá)式?D?D比較(test)。通過和shell提供的if等條件語句(后面我們會介紹)相結(jié)合我們可以方便的完判斷。
其用法如下:
test 表達(dá)式
表達(dá)式所代表的操作符有字符串操作符、數(shù)字操作符、邏輯操作符以及文件操作符。其中文件操作符是一種shell獨(dú)特的操作符,因為shell里的變量都是字符串,為了達(dá)到對文件進(jìn)行操作的目的,于是才提供了這樣的一種操作符。
1、 字符串比較
作用:測試字符串是否相等、長度是否為零,字符串是否為NULL(注:bash區(qū)分零長度字符串和空字符串)
常用的字符穿操作符有:
= 比較兩個字符串是否相同,同則為"是"!= 比較兩個字符串是否相同,不同則為"是"
-n 比較字符串長度是否大于零,如果大于零則為"是"
-z 比較字符串的穿度是否等于零,如果等于則為"是"
2、 數(shù)字比較
這里區(qū)別于其他編程語言,test語句不使用>?類似的符號來表達(dá)大小的比較,而是用整數(shù)式來表示這些。
-eq 相等
-ge 大于等于
-le 小于等于
-ne 不等于
-gt 大于
-lt 小于
#p#副標(biāo)題#e#
3、 邏輯操作! 反:與一個邏輯值相反的邏輯值
-a 與(and):兩個邏輯值為"是"返回值才為"是",反之為"否"
-o 或(or):兩個邏輯值有一個為"是",返回值就為"是"
4、 文件操作
文件測試表達(dá)式通常是為了測試文件的信息,一般由腳本來決定文件是否應(yīng)該備份、復(fù)制或刪除。由于test關(guān)于文件的操作符有很多,我們只列舉一些常用的。
-d 對象存在且為目錄返回值為"是"
-f 對象存在且為文件返回值為"是"
-L 對象存在且為符號連接返回值為"是"
-r 對象存在且可讀則返回值為"是"
-s 對象存在且長度非零則返回值為"是"
-w 對象存在且可寫則返回值為"是"
-x 對象存在且可執(zhí)行則返回值為"是"
file1 ?Cnt(-ot) file2 文件1比文件2新(舊)
四、循環(huán)結(jié)構(gòu)語句
shell常見的循環(huán)語句有for循環(huán)、while循環(huán)、until循環(huán)
for 循環(huán)
語法:for 變量 in 列表
do
操作
done
注:變量是要在循環(huán)內(nèi)部用來指代當(dāng)前所指代的列表中的那個對象的。
列表是在for 循環(huán)的內(nèi)部要操作的對象,可以是字符串也可以是文件,如果是文件則為文件名。
例:刪除垃圾箱中的所有.gz文件
#delete all file with extension of "gz" in the dustbin
for I in $HOME/dustbin/*.gz
do
rm ?Cf $i
echo "$i has been deleted!"
done
執(zhí)行結(jié)果如下:
[beichen@localhost bin]$.f_rmgz
/home/beichen/dustbin/nessus-4.0.0.2.tar.gz has been deleted!
/home/beichen/dustbin/gftp-2.2.1.tar.gz has been deleted!
While循環(huán)
語法:while 表達(dá)式
do
操作
done
只要while表達(dá)式成立,do和done之間的操作就一直會進(jìn)行。
until循環(huán)
語法:until 表達(dá)式
do
操作
done
重復(fù)do和done之間的操作直到表達(dá)式成立為止。
例:
#test until
#add from 1 to 100
total=0
num=0
until test num ?Ceq 100
do
total=`expr $total + $num` //注意,這里的引號是反引號,下同
num=`expr $num+1`
done
echo "The result is $total"
執(zhí)行結(jié)果如下:
[beichen@localhost bin]$until
The result is 5050!
五、條件語句
Shell程序中的條件語句主要有if語句、case語句;
If語句
語法:if 表達(dá)式1 then
操作
elif 表達(dá)式2 then
操作
elif 表達(dá)式3 then
操作
…..
else
操作
fi
Linux里的if的結(jié)束標(biāo)志是將if反過來寫成fi;而elif其實是else if的縮寫
其中
關(guān)鍵詞標(biāo)簽:Linux Shell編程
相關(guān)閱讀
熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 多種操作系統(tǒng)NTP客戶端配置 Linux操作系統(tǒng)修改IP
人氣排行 Linux下獲取CPUID、硬盤序列號與MAC地址 dmidecode命令查看內(nèi)存型號 linux tc實現(xiàn)ip流量限制 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 linux下解壓rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 關(guān)機(jī)、重啟、注銷 命令 查看linux服務(wù)器硬盤IO讀寫負(fù)載