ShellScript的優勢:
1、自動化管理的重要依據
2、追蹤與管理系統的重要工作
3、簡單入侵偵測功能
4、連續命令單一化
5、簡易的數據處理
6、跨平台支持與學習歷程較短
shellscript的文件後綴是.sh可以有如下兩個方法運行該文件
1、直接命令下達(必須有可讀可執行權限rx):
絕對路徑:使用 /home/dmtsai/shell.sh 來下達命令;
相對路徑:假設工作目錄在 /home/dmtsai/ ,則使用 ./shell.sh 來運行
變量『PATH』功能:將 shell.sh 放在 PATH 指定的目錄內,例如: ~/bin/
2、以 bash 程序來運行:透過『 bash shell.sh 』或『 sh shell.sh 』來運行
利用上面兩種方式運行腳本,會產生子程序,而利用source命令則可以讓腳本在父bash中運行
test 命令的測試功能
一些重要參數:
測試的標志
代表意義
1. 關於某個檔名的『文件類型』判斷,如 test -e filename 表示存在否
-e
該『檔名』是否存在?(常用)
-f
該『檔名』是否存在且為文件(file)?(常用)
-d
該『檔名』是否存在且為目錄(directory)?(常用)
-b
該『檔名』是否存在且為一個 block device 裝置?
-c
該『檔名』是否存在且為一個 character device 裝置?
-S
該『檔名』是否存在且為一個 Socket 文件?
-p
該『檔名』是否存在且為一個 FIFO (pipe) 文件?
-L
該『檔名』是否存在且為一個連結檔?
2. 關於文件的權限偵測,如 test -r filename 表示可讀否 (但 root 權限常有例外)
-r
偵測該檔名是否存在且具有『可讀』的權限?
-w
偵測該檔名是否存在且具有『可寫』的權限?
-x
偵測該檔名是否存在且具有『可運行』的權限?
-u
偵測該檔名是否存在且具有『SUID』的屬性?
-g
偵測該檔名是否存在且具有『SGID』的屬性?
-k
偵測該檔名是否存在且具有『Sticky bit』的屬性?
-s
偵測該檔名是否存在且為『非空白文件』?
3. 兩個文件之間的比較,如: test file1 -nt file2
-nt
(newer than)判斷 file1 是否比 file2 新
-ot
(older than)判斷 file1 是否比 file2 舊
-ef
判斷 file1 與 file2 是否為同一文件,可用在判斷 hard link 的判定上。 主要意義在判定,兩個文件是否均指向同一個 inode 哩!
4. 關於兩個整數之間的判定,例如 test n1 -eq n2
-eq
兩數值相等 (equal)
-ne
兩數值不等 (not equal)
-gt
n1 大於 n2 (greater than)
-lt
n1 小於 n2 (less than)
-ge
n1 大於等於 n2 (greater than or equal)
-le
n1 小於等於 n2 (less than or equal)
5. 判定字串的數據
test -z string
判定字串是否為 0 ?若 string 為空字串,則為 true
test -n 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
判斷符號中括號[]
利用中括號來判斷需要注意:
1、在中括號 [] 內的每個組件都需要有空白鍵來分隔;
2、在中括號內的變量,最好都以雙引號括號起來;
3、在中括號內的常數,最好都以單或雙引號括號起來。
shell scripts 的參數:
運行帶參數的shell scripts的格式:
/path/to/scriptname opt1 opt2 opt3 opt4
$0 $1 $2 $3 $4
除了上面之外還有一些內置的變量:
$# :代表後接的參數『個數』,以上表為例這裡顯示為『 4 』;
$@ :代表『 "$1" "$2" "$3" "$4" 』之意,每個變量是獨立的(用雙引號括起來);
$* :代表『 "$1c$2c$3c$4" 』,其中 c 為分隔字節,默認為空白鍵, 所以本例中代表『 "$1 $2 $3 $4" 』之意。
shift 會移動變量,而且 shift 後面可以接數字,代表拿掉最前面的幾個參數的意思。
單層簡單的條件判斷
if [ 條件判斷式 ]; then 當條件判斷式成立時,可以進行的命令工作內容; fi <==將 if 反過來寫,就成為 fi 啦!結束 if 之意!
多重、復雜條件判斷式
# 一個條件判斷,分成功進行與失敗進行 (else)
if [ 條件判斷式 ]; then
當條件判斷式成立時,可以進行的命令工作內容;
else
當條件判斷式不成立時,可以進行的命令工作內容;
fi
# 多個條件判斷 (if ... elif ... elif ... else) 分多種不同情況運行
if [ 條件判斷式一 ]; then
當條件判斷式一成立時,可以進行的命令工作內容;
elif [ 條件判斷式二 ]; then
當條件判斷式二成立時,可以進行的命令工作內容;
else
當條件判斷式一與二均不成立時,可以進行的命令工作內容;
fi
利用 case ..... esac 判斷
語法:
case $變量名稱 in <==關鍵字為 case ,還有變量前有錢字號
"第一個變量內容") <==每個變量內容建議用雙引號括起來,關鍵字則為小括號 )
程序段
;; <==每個類別結尾使用兩個連續的分號來處理!
"第二個變量內容")
程序段
;;
*) <==最後一個變量內容都會用 * 來代表所有其他值
不包含第一個變量內容與第二個變量內容的其他程序運行段
exit 1
;;
esac <==最終的 case 結尾!『反過來寫』思考一下!
function功能
function fname() {
程序段
}
回圈 (loop)
while [ condition ] <==中括號內的狀態就是判斷式
do <==do 是回圈的開始!
程序段落
done <==done 是回圈的結束
until [ condition ]
do
程序段落
done
[root@www scripts]# vi sh13-2.sh #!/bin/bash # Program: # Repeat question until user input correct answer. # History: # 2005/08/29 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH until [ "$yn" == "yes" -o "$yn" == "YES" ] do read -p "Please input yes/YES to stop this program: " yn done echo "OK! you input the correct answer."
[root@www scripts]# vi sh14.sh #!/bin/bash # Program: # Use loop to calculate "1+2+3+...+100" result. # History: # 2005/08/29 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH s=0 # 這是加總的數值變量 i=0 # 這是累計的數值,亦即是 1, 2, 3.... while [ "$i" != "100" ] do i=$(($i+1)) # 每次 i 都會添加 1 s=$(($s+$i)) # 每次都會加總一次! done echo "The result of '1+2+3+...+100' is ==> $s"
for...do...done (固定回圈)
for var in con1 con2 con3 ...
do
程序段
done
for (( 初始值; 限制值; 運行步階 ))
do
程序段
done
備注:
初始值:某個變量在回圈當中的起始值,直接以類似 i=1 配置好;
限制值:當變量的值在這個限制值的范圍內,就繼續進行回圈。例如 i<=100;
運行步階:每作一次回圈時,變量的變化量。例如 i=i+1。
shell script的debug
[root@www ~]# sh [-nvx] scripts.sh
選項與參數:
-n :不要運行 script,僅查詢語法的問題;
-v :再運行 sccript 前,先將 scripts 的內容輸出到螢幕上;
-x :將使用到的 script 內容顯示到螢幕上,這是很有用的參數!