1. 程式人生 > >shell腳本基礎應用(二)

shell腳本基礎應用(二)

cfa 分數 查看 條件測試操作 print 條件語句 exit 顯示 ack

前言:為了使shell腳本具有一定的“判斷”能力,根據不同的條件來完成不同的管理任務。使腳本具有一定的“智能”。
一、條件測試操作
文件測試常見操作:
-d::測試是否為目錄
-e:測試目錄或文件是否存在
-f :測試是否為文件
-r:測試當前用戶是否有權限讀取
-w:測試當前用戶是否有權限寫入
-x:測試是否設置有可執行的權限
1、文件測試:測試/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 ~]#
2、整數值比較:用來判斷已登錄用戶數量,開啟進程數,磁盤使用率是否超標,以及軟件版本號是否符合要求等。
整數值常用值比較操作:
-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
3、字符串比較:常用來檢查用戶輸入,系統環境是否滿足條件,以及判斷用戶輸入的位置參數是否符合要求。
常用字符竄選項:
=:第一個字符串與第二個字符串相同
!=:第一個字符串與第二個字符串不相同,其中“!” 符號表示取反
-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 "不覆蓋"
不覆蓋
4、邏輯測試:判斷兩個或者多個條件之間的依賴關系
常用的邏輯測試操作如下,使用時放在不同的測試語句或命令之間
&&:邏輯與,表示“而且”,只有當前後兩個條件都成立時,整個測試命令的返回值才為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
二、使用if條件語句
作用:更好的整理腳本結構,使得層次分明,清晰易懂
1、單分支的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

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: 0x000e1fe1

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
2、雙分支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服務不可用

開啟vsftpd服務器之後再次執行腳本
技術分享圖片
3、多分支if語句應用:能夠根據多個互斥條件分別執行不同操作,實際上等同於嵌套使用的if語句。
技術分享圖片
例如:根據輸入的考試分數的不同來區分優秀,合格,不合格三檔
[root@localhost ~]# vim gradediv.sh
技術分享圖片
設置權限之後執行腳本:
[root@localhost ~]# chmod +x gradediv.sh
[root@localhost ~]# ./gradediv.sh
qingshurunidefenshu(0-100):90
90 youxiu
技術分享圖片

shell腳本基礎應用(二)