前言:爲了使shell腳本具備必定的「判斷」能力,根據不一樣的條件來完成不一樣的管理任務。使腳本具備必定的「智能」。
1、條件測試操做
文件測試常見操做:
-d::測試是否爲目錄
-e:測試目錄或文件是否存在
-f :測試是否爲文件
-r:測試當前用戶是否有權限讀取
-w:測試當前用戶是否有權限寫入
-x:測試是否設置有可執行的權限
一、文件測試:測試/media/cdrom是否存在,爲0表示存在此目錄,返回1不存在。
[root@localhost ~]# [ -d /media/cdrom ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# ls -d /media/cdrom
/media/cdrom
爲了顯示更直觀,可改成如下方式
[root@localhost ~]# [ -d /media/cdrom ] && echo "yes"
yes
[root@localhost ~]#
二、整數值比較:用來判斷已登陸用戶數量,開啓進程數,磁盤使用率是否超標,以及軟件版本號是否符合要求等。
整數值經常使用值比較操做:
-eq:第一個數等於第二個數
-ne:第一個數不等於第二個數
-gt:第一個數大於第二個數
-lt:第一個數小於第二個數
-le:第一個數大於或等於第二個數
-ge:第一個數大於或等於第二個數
1)例如:判斷當前已登陸的用戶數,當超過5個時輸出「too many」
[root@localhost ~]# who
root tty1 2018-01-30 18:05 (:0)
root pts/0 2018-01-30 18:36 (192.168.1.12)
[root@localhost ~]# unum=$(who | wc -l)
[root@localhost ~]# [ $unum -gt 1 ] && echo "too many"
too many
2)判斷當前可用的空閒內存大小,當低於1024m時輸出具體數值。
[root@localhost ~]# freecc=$(free -m | grep "cache:" | awk '{print $4}')
[root@localhost ~]# [ $freecc -lt 1024 ] && echo ${freecc}MB
[root@localhost ~]# [ $freecc -lt 2048 ] && echo ${freecc}MB
[root@localhost ~]# [ $freecc -lt 100000 ] && echo ${freecc}MB
5270MB
三、字符串比較:經常使用來檢查用戶輸入,系統環境是否知足條件,以及判斷用戶輸入的位置參數是否符合要求。
經常使用字符竄選項:
=:第一個字符串與第二個字符串相同
!=:第一個字符串與第二個字符串不相同,其中「!」 符號表示取反
-z:檢查字符串是否爲空,對於定義或賦予空值的變量將視爲空串
1)例如:判斷當前的語言環境,當發現不是en.us時輸出提示信息「not en.us」
root@localhost ~]# echo $LANG //查看當前的語言環境
zh_CN.UTF-8
[root@localhost ~]# [ $LANG != "en.US" ] && echo "Not en.US" //字符串測試結果(不等於)
Not en.US
2)交互式的簡單案例
[root@localhost ~]# read -p "是否覆蓋現有文件(yes/no)?" ACK
是否覆蓋現有文件?yes
[root@localhost ~]# [ $ACK = "yes" ] && echo "覆蓋"
覆蓋
[root@localhost ~]# read -p "是否覆蓋現有文件(yes/no)?" ACK
是否覆蓋現有文件(yes/no)?no
[root@localhost ~]# [ $ACK = "no" ] && echo "不覆蓋"
不覆蓋
四、邏輯測試:判斷兩個或者多個條件之間的依賴關係
經常使用的邏輯測試操做以下,使用時放在不一樣的測試語句或命令之間
&&:邏輯與,表示「並且」,只有當先後兩個條件都成立時,整個測試命令的返回值才爲0(結果成立)
||:邏輯或,表示「或者」,只要先後兩個條件中有一個成立,整個測試命令的返回值即爲0(結果成立)
!:邏輯否,表示「不」 ,只有當指定的條件不成立時,整個測試命令的返回值才爲0(結果成立)
1)例如:判斷當前linux內核版本是否大於2.4,能夠執行如下操做:
[root@localhost ~]# munm=$(uname -r | awk -F. '{print $1}') //取主版本號
[root@localhost ~]# snum=$(uname -r | awk -F. '{print $2}') //取此版本號
[root@localhost ~]# [ $munm -eq 2 ] && [ $snum -gt 4 ] && echo "ok"
ok
2、使用if條件語句
做用:更好的整理腳本結構,使得井井有條,清晰易懂
一、單分支的if語句
1)例如:掛載光盤的操做,先判斷掛載點目錄是否存在,若不存在則新建此目錄
Vi chkmountdir.sh,內容以下:
vim chkmountdir.sh
#!/bin/bash
mount_dir="/media/cdrom"
if [ ! -d $mount_dir ]
then
mkdir -p $mount_dir
fi
2)判斷當前用戶是否是root,若是不是則報錯並執行exit 1退出腳本(1表示退出後的返回狀態值),而再也不執行其餘代碼
[root@localhost ~]# vim chkifroot.sh
#!/bin/bash
if [ "$USER" != "root" ]
then
echo "cuowu:fei root yonghu,quanxian buzu"
exit 1
fi
fdisk -l /dev/sda
執行腳本:./chkifroot.sh,由於當前登陸的用戶是root,因此執行fi以後的代碼
[root@localhost ~]# chmod +x chkifroot.sh
[root@localhost ~]# ./chkifroot.sh linux
Disk /dev/sda: 107.4 GB, 107374182400 bytes
255 heads, 63 sectors/track, 13054 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000e1fe1shell
Device Boot Start End Blocks Id System
/dev/sda1 * 1 64 512000 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 64 13055 104344576 8e Linux LVM
二、雙分支if語句應用,語句結構如圖:
對於雙分支的選擇結構,要針對「條件成立「,」條件不成立」,兩種狀況分別執行不一樣的操做
1)例如:編寫一個連通性測試腳本pinghost.sh,
[root@localhost ~]# vim pinghost.sh
#!/bin/bash
ping -c 3 -i 0.2 -w 3 $1 &> /dev/null //檢查目標主機是否能連通
if [ $? -eq 0 ] //判斷前一條命令的返回狀態
then
echo "host $1 is up."
else
echo "host $1 is down."
fi
[root@localhost ~]# chmod +x pinghost.sh
[root@localhost ~]# ./pinghost.sh 192.168.1.1
host 192.168.1.1 is up.
[root@localhost ~]# ./pinghost.sh 192.168.1.0
host 192.168.1.0 is down.
在上述腳本中,爲了提升ping命令的測試效率,使用了「 -c . -i . -w,選項,分別指定只發送三個測試包,間隔0.2秒,超時3秒,另外,經過「&> /dev/null"屏蔽了ping命令執行過程的輸出信息。
2)再例如:經過shell腳本檢查vsftpd服務是否運行,若是已運行則列出其監聽地址、pid號,不然輸出提示「vsftpd服務不可用!」
首先安裝vsftpd軟件,開啓vsftpd服務(軟件統光盤裏)
而後編寫腳本vim chkftpd.sh
[root@localhost ~]# chmod +x chkftpd.sh
[root@localhost ~]# ./chkftpd.sh
jinggao:vsftpd fuwubukeyong!
設置權限並執行,提示vsftpd服務不可用vim
開啓vsftpd服務器以後再次執行腳本
三、多分支if語句應用:可以根據多個互斥條件分別執行不一樣操做,實際上等同於嵌套使用的if語句。
例如:根據輸入的考試分數的不一樣來區分優秀,合格,不合格三檔
[root@localhost ~]# vim gradediv.sh
設置權限以後執行腳本:
[root@localhost ~]# chmod +x gradediv.sh
[root@localhost ~]# ./gradediv.sh
qingshurunidefenshu(0-100):90
90 youxiu
bash