Linux下的shell程式設計入門(轉)
Linux下的shell程式設計入門(轉)[@more@] 通常情況下,我們從命令列輸入命令每輸入一次就能夠得到系統的一次響應。一旦需要我們一個接著一個的輸入命令而最後才得到結果的時候,這樣的做法顯然就沒有效率。要達到這樣的目的,通常我們利用shell程式或者shell指令碼來實現。
一、簡介
Shell程式設計有很多類似C語言和其他程式語言的特徵,但是又沒有程式語言那樣複雜。Shell程式就是放在一個檔案中的一系列Linux命令和實用程式,在執行的時候,透過Linux一個接著一個地解釋和執行每個命令。
下面我們來看一個簡單的shell程式:
1、首先建立一個內容如下的檔案,名字為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、編輯完該檔案之後它還不能執行,我們需要給它設定可執行許可權。使用如下命令:
chmod +x date
透過以上過程之後,我們就可以像使用ls命令一樣執行這個shell程式.
[beichen@localhost bin]$ date
Mr.beichen,Today is:
January 13 Friday
Whish you a lucky day !
為了在任何目錄裡都可以執行這個程式,可以將bin的這個目錄新增到路徑中去。
[beichen@localhost bin]$ PATH=$PATH:$HOME/bin
(注:這裡的$HOME代替的是/home/beichen,而bin目錄是自己建的一個目錄)
另外一種執行date的方法就是把它作為一個引數傳給shell命令:
[beichen@localhost /]$ bash date
Mr.beichen,Today is:
January 13 Friday
Whish you a lucky day !
儘管在前面我們使用chmod +x date將date設定為可執行,其實不設定也沒有關係,但在Linux裡執行它,需要先告訴系統它是一個可執行的指令碼。
[beichen@localhost /]$ .date
Mr.beichen,Today is:
January 13 Friday
Whish you a lucky day !
即在date前面加上一個點”.”,並且用空格與後面的shell指令碼的檔名隔開。當然,不推薦這樣做。
二、shell引數
如同ls 命令可以接受目錄等作為它的引數一樣,在shell程式設計時同樣可以使用引數。Shell有位置引數和內部引數。
1、 位置引數
由系統提供的引數稱為位置引數。位置引數的值可以用$N得到,N是一個數字,如果為1,即$1.類似C語言中的陣列,Linux會把輸入的命令字串分段並給每段進行標號,標號從0開始。第0號為程式名字,從1開始就表示傳遞給程式的引數。如$0表示程式的名字,$1表示傳遞給程式的第一個引數,以此類推。
2、 內部引數
上述過程中的$0是一個內部變數,它是必須的,而$1則可有可無。和$0一樣的內部變數還有以下幾個。
$# ----傳遞給程式的總的引數數目
$? ----上一個程式碼或者shell程式在shell中退出的情況,如果正常退出則返回0,反之為非0值。
$* ----傳遞給程式的所有引數組成的字串。
下面舉例進行說明:
建立一個內容為如下的程式P1:
echo “Program name is $0”
echo “There are totally $# parameters passed to this program”
echo “The last is $?”
echo “The parameters are $*”
執行後的結果如下:
[beichen@localhost bin]$ P1 this is a test program //傳遞5個引數
Program name is /home/beichen/bin/P1 //給出程式的完整路徑和名字
There are totally 5 parameters passed to this program //引數的總數
The last is 0 //程式執行結果
The parameters are this is a test program //返回有引數組成的字串
下面我們利用內部變數和位置引數編寫一個名為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 //先對檔案進行壓縮
mv $1.gz $HOME/dustbin //移動到回收站
echo “File $1 is deleted !”
fi
三、變數表示式
在上面我們編寫的小程式中我們用到了一個關鍵字test,其實它是shell程式中的一個表示式?D?D比較(test)。透過和shell提供的if等條件語句(後面我們會介紹)相結合我們可以方便的完判斷。
其用法如下:
test 表示式
表示式所代表的運算子有字串運算子、數字運算子、邏輯運算子以及檔案運算子。其中檔案運算子是一種shell獨特的運算子,因為shell裡的變數都是字串,為了達到對檔案進行操作的目的,於是才提供了這樣的一種運算子。
1、 字串比較
作用:測試字串是否相等、長度是否為零,字串是否為NULL(注:bash區分零長度字串和空字串)
常用的字元穿運算子有:
= 比較兩個字串是否相同,同則為“是”!= 比較兩個字串是否相同,不同則為“是”
-n 比較字串長度是否大於零,如果大於零則為“是”
-z 比較字串的穿度是否等於零,如果等於則為“是”
2、 數字比較
這裡區別於其他程式語言,test語句不使用>?類似的符號來表達大小的比較,而是用整數式來表示這些。
-eq 相等
-ge 大於等於
-le 小於等於
-ne 不等於
-gt 大於
-lt 小於
3、 邏輯操作! 反:與一個邏輯值相反的邏輯值
-a 與(and):兩個邏輯值為“是”返回值才為“是”,反之為“否”
-o 或(or):兩個邏輯值有一個為“是”,返回值就為“是”
4、 檔案操作
檔案測試表示式通常是為了測試檔案的資訊,一般由指令碼來決定檔案是否應該備份、複製或刪除。由於test關於檔案的運算子有很多,我們只列舉一些常用的。
-d 物件存在且為目錄返回值為“是”
-f 物件存在且為檔案返回值為“是”
-L 物件存在且為符號連線返回值為“是”
-r 物件存在且可讀則返回值為“是”
-s 物件存在且長度非零則返回值為“是”
-w 物件存在且可寫則返回值為“是”
-x 物件存在且可執行則返回值為“是”
file1 ?Cnt(-ot) file2 檔案1比檔案2新(舊)
四、迴圈結構語句
shell常見的迴圈語句有for迴圈、while迴圈、until迴圈
for 迴圈
語法:for 變數 in 列表
do
操作
done
注:變數是要在迴圈內部用來指代當前所指代的列表中的那個物件的。
列表是在for 迴圈的內部要操作的物件,可以是字串也可以是檔案,如果是檔案則為檔名。
例:刪除垃圾箱中的所有.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
執行結果如下:
[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迴圈
語法:while 表示式
do
操作
done
只要while表示式成立,do和done之間的操作就一直會進行。
until迴圈
語法:until 表示式
do
操作
done
重複do和done之間的操作直到表示式成立為止。
例:
#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”
執行結果如下:
[beichen@localhost bin]$until
The result is 5050!
五、條件語句
Shell程式中的條件語句主要有if語句、case語句;
If語句
語法:if 表示式1 then
操作
elif 表示式2 then
操作
elif 表示式3 then
操作
…..
else
操作
fi
Linux裡的if的結束標誌是將if反過來寫成fi;而elif其實是else if的縮寫
其中elif理論上可以有無限多個。
Case語句
語法:case 字串 in
值1|值2)
操作::
值3|值4)
操作::
值5|值6)
操作::
*}
操作::
esac
case的作用就是當字串與某個值相同是就執行那個值後面的操作。如果同一個操作對於多個值,則使用”|”將各個值分開。在case的每一個操作的最後面都有兩個”::”,分號是必須的。
例:
case $USER in
beichen)
Echo “You are beichen!”;;
liangnian)
echo “You are liangnian”; //注意這裡只有一個分號
echo “Welcome!”;; //這裡才是兩個分號
root)
echo “You are root!:echo Welcome!”;; //將兩命令寫在一行,用一個分號作為分隔符
*)
echo “Who are you?$USER?”;;
esac
執行結果:
[liangnian@localhost bin]$ test
You are liangnian
Welcome!
關於shell程式設計基礎的東西就介紹這麼多,如果你想更進一步瞭解shell程式設計的知識,請查閱相關書籍。
一、簡介
Shell程式設計有很多類似C語言和其他程式語言的特徵,但是又沒有程式語言那樣複雜。Shell程式就是放在一個檔案中的一系列Linux命令和實用程式,在執行的時候,透過Linux一個接著一個地解釋和執行每個命令。
下面我們來看一個簡單的shell程式:
1、首先建立一個內容如下的檔案,名字為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、編輯完該檔案之後它還不能執行,我們需要給它設定可執行許可權。使用如下命令:
chmod +x date
透過以上過程之後,我們就可以像使用ls命令一樣執行這個shell程式.
[beichen@localhost bin]$ date
Mr.beichen,Today is:
January 13 Friday
Whish you a lucky day !
為了在任何目錄裡都可以執行這個程式,可以將bin的這個目錄新增到路徑中去。
[beichen@localhost bin]$ PATH=$PATH:$HOME/bin
(注:這裡的$HOME代替的是/home/beichen,而bin目錄是自己建的一個目錄)
另外一種執行date的方法就是把它作為一個引數傳給shell命令:
[beichen@localhost /]$ bash date
Mr.beichen,Today is:
January 13 Friday
Whish you a lucky day !
儘管在前面我們使用chmod +x date將date設定為可執行,其實不設定也沒有關係,但在Linux裡執行它,需要先告訴系統它是一個可執行的指令碼。
[beichen@localhost /]$ .date
Mr.beichen,Today is:
January 13 Friday
Whish you a lucky day !
即在date前面加上一個點”.”,並且用空格與後面的shell指令碼的檔名隔開。當然,不推薦這樣做。
二、shell引數
如同ls 命令可以接受目錄等作為它的引數一樣,在shell程式設計時同樣可以使用引數。Shell有位置引數和內部引數。
1、 位置引數
由系統提供的引數稱為位置引數。位置引數的值可以用$N得到,N是一個數字,如果為1,即$1.類似C語言中的陣列,Linux會把輸入的命令字串分段並給每段進行標號,標號從0開始。第0號為程式名字,從1開始就表示傳遞給程式的引數。如$0表示程式的名字,$1表示傳遞給程式的第一個引數,以此類推。
2、 內部引數
上述過程中的$0是一個內部變數,它是必須的,而$1則可有可無。和$0一樣的內部變數還有以下幾個。
$# ----傳遞給程式的總的引數數目
$? ----上一個程式碼或者shell程式在shell中退出的情況,如果正常退出則返回0,反之為非0值。
$* ----傳遞給程式的所有引數組成的字串。
下面舉例進行說明:
建立一個內容為如下的程式P1:
echo “Program name is $0”
echo “There are totally $# parameters passed to this program”
echo “The last is $?”
echo “The parameters are $*”
執行後的結果如下:
[beichen@localhost bin]$ P1 this is a test program //傳遞5個引數
Program name is /home/beichen/bin/P1 //給出程式的完整路徑和名字
There are totally 5 parameters passed to this program //引數的總數
The last is 0 //程式執行結果
The parameters are this is a test program //返回有引數組成的字串
下面我們利用內部變數和位置引數編寫一個名為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 //先對檔案進行壓縮
mv $1.gz $HOME/dustbin //移動到回收站
echo “File $1 is deleted !”
fi
三、變數表示式
在上面我們編寫的小程式中我們用到了一個關鍵字test,其實它是shell程式中的一個表示式?D?D比較(test)。透過和shell提供的if等條件語句(後面我們會介紹)相結合我們可以方便的完判斷。
其用法如下:
test 表示式
表示式所代表的運算子有字串運算子、數字運算子、邏輯運算子以及檔案運算子。其中檔案運算子是一種shell獨特的運算子,因為shell裡的變數都是字串,為了達到對檔案進行操作的目的,於是才提供了這樣的一種運算子。
1、 字串比較
作用:測試字串是否相等、長度是否為零,字串是否為NULL(注:bash區分零長度字串和空字串)
常用的字元穿運算子有:
= 比較兩個字串是否相同,同則為“是”!= 比較兩個字串是否相同,不同則為“是”
-n 比較字串長度是否大於零,如果大於零則為“是”
-z 比較字串的穿度是否等於零,如果等於則為“是”
2、 數字比較
這裡區別於其他程式語言,test語句不使用>?類似的符號來表達大小的比較,而是用整數式來表示這些。
-eq 相等
-ge 大於等於
-le 小於等於
-ne 不等於
-gt 大於
-lt 小於
3、 邏輯操作! 反:與一個邏輯值相反的邏輯值
-a 與(and):兩個邏輯值為“是”返回值才為“是”,反之為“否”
-o 或(or):兩個邏輯值有一個為“是”,返回值就為“是”
4、 檔案操作
檔案測試表示式通常是為了測試檔案的資訊,一般由指令碼來決定檔案是否應該備份、複製或刪除。由於test關於檔案的運算子有很多,我們只列舉一些常用的。
-d 物件存在且為目錄返回值為“是”
-f 物件存在且為檔案返回值為“是”
-L 物件存在且為符號連線返回值為“是”
-r 物件存在且可讀則返回值為“是”
-s 物件存在且長度非零則返回值為“是”
-w 物件存在且可寫則返回值為“是”
-x 物件存在且可執行則返回值為“是”
file1 ?Cnt(-ot) file2 檔案1比檔案2新(舊)
四、迴圈結構語句
shell常見的迴圈語句有for迴圈、while迴圈、until迴圈
for 迴圈
語法:for 變數 in 列表
do
操作
done
注:變數是要在迴圈內部用來指代當前所指代的列表中的那個物件的。
列表是在for 迴圈的內部要操作的物件,可以是字串也可以是檔案,如果是檔案則為檔名。
例:刪除垃圾箱中的所有.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
執行結果如下:
[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迴圈
語法:while 表示式
do
操作
done
只要while表示式成立,do和done之間的操作就一直會進行。
until迴圈
語法:until 表示式
do
操作
done
重複do和done之間的操作直到表示式成立為止。
例:
#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”
執行結果如下:
[beichen@localhost bin]$until
The result is 5050!
五、條件語句
Shell程式中的條件語句主要有if語句、case語句;
If語句
語法:if 表示式1 then
操作
elif 表示式2 then
操作
elif 表示式3 then
操作
…..
else
操作
fi
Linux裡的if的結束標誌是將if反過來寫成fi;而elif其實是else if的縮寫
其中elif理論上可以有無限多個。
Case語句
語法:case 字串 in
值1|值2)
操作::
值3|值4)
操作::
值5|值6)
操作::
*}
操作::
esac
case的作用就是當字串與某個值相同是就執行那個值後面的操作。如果同一個操作對於多個值,則使用”|”將各個值分開。在case的每一個操作的最後面都有兩個”::”,分號是必須的。
例:
case $USER in
beichen)
Echo “You are beichen!”;;
liangnian)
echo “You are liangnian”; //注意這裡只有一個分號
echo “Welcome!”;; //這裡才是兩個分號
root)
echo “You are root!:echo Welcome!”;; //將兩命令寫在一行,用一個分號作為分隔符
*)
echo “Who are you?$USER?”;;
esac
執行結果:
[liangnian@localhost bin]$ test
You are liangnian
Welcome!
關於shell程式設計基礎的東西就介紹這麼多,如果你想更進一步瞭解shell程式設計的知識,請查閱相關書籍。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-961993/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux入門---(三)Shell程式設計Linux程式設計
- Shell程式設計入門:Linux直譯器原理(轉)程式設計Linux
- Shell 程式設計入門程式設計
- shell程式設計入門程式設計
- Linux-shell程式設計入門基礎Linux程式設計
- csh shell程式設計入門程式設計
- shell程式設計入門指南程式設計
- linux下的SHELL程式設計Linux程式設計
- Linux程式設計入門-crypt(轉)Linux程式設計
- Linux程式設計入門-gpm(轉)Linux程式設計
- Linux程式設計入門 - crypt(轉)Linux程式設計
- Shell程式設計入門例項程式設計
- linux新手入門――shell入門(轉)Linux
- Linux 程式設計之Shell程式設計(轉)Linux程式設計
- Linux的shell程式設計(一)(轉)Linux程式設計
- Linux的shell程式設計(二)(轉)Linux程式設計
- Linux的shell程式設計(三)(轉)Linux程式設計
- Linux的shell程式設計(四)(轉)Linux程式設計
- Linux程式設計入門 - Dialog(轉)Linux程式設計
- Linux程式設計入門 - SVGALIB(轉)Linux程式設計SVG
- Linux系統下的多執行緒程式設計入門(轉)Linux執行緒程式設計
- Linux Shell程式設計(5)——shell特殊字元(下)Linux程式設計字元
- Linux網路程式設計入門 (轉載)Linux程式設計
- Linux程式設計入門 - zlib的運用(轉)Linux程式設計
- Linux命令列與shell指令碼程式設計入門經驗Linux命令列指令碼程式設計
- TCSHshell程式設計入門(轉)程式設計
- linux作業系統下c語言程式設計入門(1)(轉)Linux作業系統C語言程式設計
- linux作業系統下c語言程式設計入門(2)(轉)Linux作業系統C語言程式設計
- 10分鐘入門Shell指令碼程式設計指令碼程式設計
- Shell指令碼程式設計30分鐘入門指令碼程式設計
- shell程式設計(轉)程式設計
- 玩轉Linux – shell 程式設計基礎Linux程式設計
- linux下的shell程式設計之--擷取字串Linux程式設計字串
- Linux Shell程式設計(1)——shell程式設計簡介Linux程式設計
- Linux程式設計入門 - socket/inetd programming(轉)Linux程式設計
- Linux程式設計入門 fork/pthread/signals(轉)Linux程式設計thread
- linux shell 程式設計Linux程式設計
- linux shell程式設計Linux程式設計