Shell Script
顧名思義,Shell Script就是利用 shell所寫的一個腳本,簡單來說就是將許多shell指令集合起來,可以一次執行。相當於dos中的.bat批次文件。
Shell腳本是最常用的系統管理工具,一般用來結合程序完成工作。
--------------------------------Demo--------------------------------
#!/bin/bash
# Program:
# This programis used to show "Hello World !" in screen.
# History:
# 2005/08/23VBird First release
PATH=$PATH:~/jscai/bin; export PATH
echo -e"Hello World ! \a \n"
exit 0
第一行,用#!指定內核的解析器,避免誤用解析器,而浪費性能。一般爲 #!/bin/bash
第二行開始用來說明整個程序的狀態。一般來說:
1. 內容與功能; 2. 版本信息; 3. 作者與聯絡方式; 4. 建檔日期;5. 歷史紀錄 等等。
指明主要環境變量,如此一來,則可讓我們直接下達指令,而不必寫絕對路徑呢!
最後,我們通過 $? 這個變量來判斷程序是否執行成功,然後退出程序exit 0
參數
執行Shell腳本的命令行參數,一般由數字來命名,如$0, $1,$2等。由於歷史原因,超過9的要加大括號${10},${11}
sh
sh指令用於執行script,也可以直接用點.來執行,格式如下:
sh [-nvx]scripts.sh
參數:
-n :不要執行 script,僅查詢語法的問題;
-v :再執行 sccript 前,先將 scripts 的內容輸出到屏幕上;
-x :將使用到的 script內容顯示到屏幕上,有debug的效果!
&&/||
&& 與,|| 或 符,不僅可以用在條件判斷中,也可以在平時的指令中用到。
$ ls /jscai && ls -l jscai >list.txt 先看有沒有jscai文件夾,有則執行
$ ls /jscai || mkdir 同理||,先看有沒有jscai文件夾,沒有則創建
$ ls /jscai && echo"exist" || echo "not exist" 結合使用,有則exist,無則not
一個是前面true執行後面的,另一個是前面false執行後面的。
test
但是test不會輸出,而只是返回一個true/false,所以我們可以通過&&和||來輸出,檢測zip是否存在:
$ test -e zip &&echo 1||echo 2
文件類型----------------------------------
-e :該『檔名』是否存在?(常用)
-f :該『檔名』是否爲檔案(file)?(常用)
-d :該『文件名』是否爲目錄(directory)?(常用)
-b :該『文件名』是否爲一個block device 裝置?
-c :該『文件名』是否爲一個character device 裝置?
-S :該『檔名』是否爲一個Socket 檔案?
-p :該『檔名』是否爲一個FIFO (pipe) 檔案?
-L :該『檔名』是否爲一個連結檔?
文件權限----------------------------------
-r :偵測該文件名是否具有『可讀』的屬性?
-w :偵測該檔名是否具有『可寫』的屬性?
-x :偵測該檔名是否具有『可執行』的屬性?
-u :偵測該文件名是否具有『SUID』的屬性?
-g :偵測該文件名是否具有『SGID』的屬性?
-k :偵測該文件名是否具有『Stickybit』的屬性?
-s :偵測該檔名是否爲『非空白檔案』?
兩個文件的比較----------------------------------
-nt :(newer than)判斷 file1 是否比 file2 新
-ot :(older than)判斷 file1 是否比 file2 舊
-ef :判斷 file2 與 file2 是否爲同一檔案,可用在判斷hard link 的判定上。主要意義在判定,兩個檔案是否均指向同一個 inode 哩!
兩個數的比較----------------------------------
-eq :兩數值相等(equal) 等效 ==
-ne :兩數值不等 (notequal) 等效 !=
-gt :n1 大於 n2(greater than)
-lt :n1 小於 n2 (lessthan)
-ge :n1 大於等於 n2(greater than or equal)
-le :n1 小於等於 n2 (lessthan or equal)
5. 判定字符串的數據
test -z string
判定字符串是否爲 0 ?若 string 爲空字符串,則爲 true
test -n string 等效於 test string
判定字符串是否非爲 0 ?若 string 爲空字符串,則爲false。注: -n 亦可省略
test str1 = str2
判定 str1 是否等於 str2 ,若相等,則回傳 true
test str1 !=str2
判定 str1 是否不等於 str2 ,若相等,則回傳false
6. 多重條件判定,例如:test -r filename -a -x filename
-a
(and)兩狀況同時成立!例如test -r file -a -x file,則 file 同時具有 r 與 x 權限時,纔回傳 true。
-o
(or)兩狀況任何一個成立!例如test -r file -o -x file,則file 具有 r 或 x 權限時,就可回傳 true。
!
反相狀態,如 test ! -x file,當 file 不具有 x 時,回傳 true
我們還可以使用判斷符號[ ]來代替test,一般用在if… then… fi 中,判斷符號[]需要在裏面的兩邊都加空格。 所以上面test一開始的例子可以寫成:
$ [ -e zip]&& echo 1 || echo 2
同理有:[ $param1 == $param2], [ $param1 != $param2 ], [ $param1 -gt $param2 ], [ $param1 -lt $param2 ], [ $param1-ge $param2 ]
$ [ $param ] && echo 1 || echo 2 等效於test string :$param已初始化,且非空白字符串
相當於java的: if (parma != null && parma.trim() != "")
if…then
基本句式:
if [ ]; then
elif [ ]; then
else
fi
遇到複雜的條件,可以搭配&&和||來使用:
if [ -d worker ]&& [ $1 == “work” ]; then
echo “Start to work!”
elif [ $1 == “stop” ];then
echo “Stop working!”
else
echo “No command ~”
if
case…esac
case使用於多個條件的情況,但是語法比較複雜,所以用得也不是很多。如下:
case $1 in
"A") #條件1
echo "Bingo!"
;; #條件結束符
"B") #條件2
echo "Pass, pls try again."
;;
*) #條件else
echo "Your cmd is wrong."
;;
esac #結束符
function 函數
在script中定義函數,然後就可以直接使用,裏面也是同樣使用$1等作爲入參。
function printit(){
echo -n "Your choice is "
}
printit ABC
for do done
這裏的for和一般程序語言的for類似,都是三個條件控制。
for (( 初始值; 限制值; 執行步階 ))
do
程序段
done
如:
for (( i=0; i<=10; i=i+1 ))
do
echo $i;
done
也可以寫成枚舉形式,一般遍歷文件也是用這種方式:forfile in `ls tmp_*`
for word in A B C
do
echo $word;
done
for line in `cat for.sh`
do
echo $line;
done
while do done
while 是『當....時』,所以,這種方式說的是『當 condition 條件成立時,就進行循環,直到 condition 的條件不成立才停止』的意思。
而until do done 則相反,當…時終止。
param="";
while [ "$param" !="true" ]
do
echo "Looping";
param=true;
done
逐行讀取文件,下面兩種方式是等效的。
while read line
do
echo $line;
done< for.sh
cat for.sh | while read line
do
echo $line;
done
參考《鳥哥的Linux私房菜》:http://download.csdn.net/detail/tiwerbao/6564193