linux 編寫shell管理腳本02

火星人 @ 2014-03-08 , reply:0


編寫Shell管理腳本(二)
一、if語句
1,條件測試
test 測試表達式是否成立,成立結果為0

測試文件狀態:
-d 是否為目錄
-e 目錄或文件是否存在
-f 是否為文件
-r 當前用戶是否有許可權讀取


-w 當前用戶是否有許可權寫入
-x 當前用戶是否可執行該文件
-L 是否為符號連接文件
數值比較:
-eq 等於

Equal
-ne 不等於 Not Equal
-gt 大於 Greater Than
-lt 小於 Lesser Than


-le 小於或等於 Lesser or Equal
-ge 大於或等於 Greater or Equal
字元串比較:

= 內容相同
!= 內容不同,! 號表示相反的意思
-z 內容為空
條件判斷:
-a或&& 邏輯與


前後表達式都成立時整個測試結果才為真,否則為假
-o或|| 邏輯或
操作符兩邊至少一個為真時,結果為真,否則結果為假
! 邏輯否


當指定的條件不成立時,返回結果為真

先測試“/etc/vsftpd”、“/etc/hosts”是否為目錄,並通過“$?”變數查看返回狀態值,據此判斷測試結果. [root@localhost ~]# [ -d /etc/vsftpd ] [root@localhost ~]# echo $? 0 [root@localhost ~]# [ -d /etc/hosts ] [root@localhost ~]# echo $? 1 [root@localhost ~]# ls -ld /etc/vsftpd /etc/hosts -rw-r--r-- 2 root root 187 10-17 13:53 /etc/hosts drwxr-xr-x 2 root root 4096 10-18 13:31 /etc/vsftpd
測試“/media/cdrom/Server”及其父目錄是否存在,如果存在則顯示“YES”,否則不輸出任何信息. [root@localhost ~]# [ -e /media/cdrom/Server ] && echo "YES" //無輸出表示該目錄不存在 [root@localhost ~]# [ -e /media/cdrom ] && echo "YES" YES //顯示YES表示該目錄存在
使用普通用戶teacher登錄,並測試是否對“/etc/passwd”文件有讀、寫許可權,如果是則顯示“YES”. [teacher@localhost ~]$ [ -w /etc/passwd ] && echo "YES" [teacher@localhost ~]$ [ -r /etc/passwd ] && echo "YES" YES
測試當前登錄到系統中的用戶數量是否小於或等於10,是則輸出“YES”. [root@localhost ~]$ who | wc -l 2 [root@localhost ~]$ [ `who | wc -l` -le 10 ] && echo "YES" YES


提取出“/boot”分區的磁碟使用率,並判斷是否超過95%(為了便於理解,操作步驟以適當進行分解). [root@localhost ~]# df -hT | grep "/boot" | awk '{print $6}' [root@localhost ~]# read -p "Localtion: " FilePath Localtion: /etc/inittab [root@localhost ~]# [ $FilePath = "/etc/inittab" ] && echo "YES" YES
若當前環境變數LANG的內容不是“en.US”,則輸出LANG變數的值,否則無輸出. [root@localhost ~]# [ $LANG != "en.US" ] && echo $LANG zh_CN.UTF-8
使用touch命令建立一個新文件,測試其內容是否為空,向文件中寫入內容后,再次進行測試. [root@localhost ~]# touch zero.file [root@localhost ~]# [ -z 'cat zero.file' ] && echo "YES" YES //表示該文件為空文件 [root@localhost ~]# [ -z 'cat zero.file' ] && echo "YES" [root@localhost ~]# echo "something" > zero.file [root@localhost ~]# [ -z 'cat zero.file' ] && echo "YES" //無輸出表示文件不為空
測試當前的用戶是否是teacher,若不是則提示“Not teacher”. [root@localhost ~]# echo $USER root [root@localhost ~]# [ $USER = "teacher" ] || echo "Not teacher" Not teacher
只要“/etc/rc.d/rc.local”或者“/etc/init.d/rc.local”中有一個是文件,則顯示“YES”,否則無任何輸出. [root@localhost ~]# [ -f /etc/rc.d/rc.local ] || [ -f /etc/init.d/rc.local ] && echo "YES" YES
測試“/etc/profile” 文件是否有可執行許可權,若確實沒有可執行許可權,則提示“No x mode.”的信息. [root@localhost ~]# [ ! -x "/etc/profile" ] && echo "No x mode." No x mode.


若當前的用戶是root且使用的shell程序是“/bin/bash”, 則顯示“YES”,否則無任何輸出. [root@localhost ~]# echo $USER $SHELL root /bin/bash [root@localhost ~]# [ $USER = "root" ] && [ $SHELL = '/bin/bash' ] && echo "YES" YES
2,if語句格式
單分支:
if 條件測試命令
then 命令序列

fi
雙分支:
if 條件測試命令
then 命令序列1
else 命令序列2


fi
多分支:
if 條件測試命令1 ; then
命令序列1

elif 條件測試命令2 ; then
命令序列2
elif ...
else
命令序列n


fi

檢查“/var/log/messages”文件是否存在,若存在則統計文件內容的行數並輸出,否則不做任何操作(合理使用變數,可以提高編寫效率). [root@localhost ~]# vi chklog.sh #!/bin/bash LogFile="/var/log/messages" if [ -f $LogFile ] ; then wc -l $LogFile fi [root@localhost ~]# sh chklog.sh 1005 /var/log/messages
提示用戶指定備份目錄的路徑,若目錄已存在則顯示提示信息后跳過,否則顯示相應提示信息后創建該目錄. [root@localhost ~]# vi mkbak.sh #!/bin/bash read -p "What is your backup directory: " BakDir if [ -d $BakDir ] ; then echo "$BakDir already exist. " else echo "$BakDir is not exist, will make it. " mkdir $BakDir fi [root@localhost ~]# sh mkbak.sh What is your backup directory: /opt/bakroot /opt/bakroot is not exist, will make it. [root@localhost ~]# ls -ld /opt/bakroot/ drwxr-xr-x. 2 root root 4096 11?.17 19:30 /opt/bakroot/
統計當前登錄到系統中的用戶數量,並判斷是否超過三個,若是則顯示實際數量並給出警告信息,否則列出登錄的用戶賬號名稱及所在終端. [root@localhost ~]# vi chkuser.sh #!/bin/bash UserNum=`who | wc -l` if [ $UserNum -gt 3 ] ; then echo "Alert, too many login users ( Total: $UserNum ). " else echo "Login users: " who | awk '{print $1,$2}' fi [root@localhost ~]# sh chkuser.sh Login users: root tty1 root pts/0


檢查portmap進程是否已經存在,若已經存在則輸出“portmap service if running.” ;否則檢查是否存在“/etc/rc.d/init.d/portmap” 可執行腳本,存在則啟動portmap服務,否則提示“no portmap script file.”. [root@localhost ~]# vi chkportmap.sh #!/bin/bash pgrep portmap &> /dev/null if [ $? -eq 0 ] ; then echo "portmap service is running. " elif [ -x "/etc/rc.d/init.d/portmap" ] ; then service portmap start else echo "no portmap script file. " fi [root@localhost ~]# sh chkportmap.sh no portmap script file.
每隔五分鐘監測一次mysqld服務進程的運行狀態,若發現mysqld進程已終止,則在“/var/log/messages”文件中追加寫入日誌信息(包括當時時間),並重啟mysqld服務;否則不進行任何操作. [root@localhost ~]# vi chkportmap.sh #!/bin/bash service mysqld status &> /dev/null if [ $? -ne 0 ] ; then echo "At time: `date`: MySQL server is down. " >> /var/log/messages service mysqld restart fi [root@localhost ~]# sh chkportmap.sh [root@localhost ~]# tail -1 /var/log/messages At time: 2011 年 11 月 18 日 星期五 20:16:31 CST : MySQL server is down. [root@localhost ~]# crontab –e //需確認crond服務已運行 */5 * * * * /root/chkdbsvr.sh
二、for語句
根據變數的不同取值,重複執行一組命令操作

語法:
for 變數名 in 取值列表
do
命令序列
done




依次輸出三條文字信息,包括一天中的“Moring”、“Noon”、“Evening”字串. [root@localhost ~]# vi showday.sh #!/bin/bash for TM in "Morning" "Noon" "Evening" do echo "The $TM of the day. " done [root@localhost ~]# sh showday.sh The Morning of the day. The Noon of the day. The Evening of the day.
對於使用“/bin/bash”作為登錄shell的系統用戶,檢查他們在“/opt”目錄中擁有的子目錄或文件數量,如果超過100個,則列出具體數值及對應的用戶賬號. [root@localhost ~]# vi chkfileown.sh #!/bin/bash DIR="/opt" LMT=100 ValidUsers=`grep "/bin/bash" /etc/passwd | cut -d ":" -f 1` for UserName in $ValidUsers do Num=`find $DIR -user $UserName | wc -l` if [ $Num -gt $LMT ] ; then echo "$UserName have $Num files. " fi done [root@localhost ~]# sh chkfileown.sh [root@localhost ~]# find -user root | wc -l 40
計算“/etc”目錄中所有“*.conf”形式的配置文件所佔用的總空間大小. [root@localhost ~]# vi confsize.sh #!/bin/bash SizeNums=$(ls -l $(find /etc -type f -a -name *.conf) | awk '{print $5}') Total=0 for i in $SizeNums do Total=`expr $Total $i` done echo "Total size of conf files: $Total bytes. " [root@localhost ~]# sh confsize.sh Total size of conf files: 813 bytes. 三、while語句
重複測試指定的條件,只要條件成立則反覆執行對應的命令操作

語法:
while 命令或表達式
do
命令列表
done



由用戶從鍵盤輸入一個大於1的整數(如50),並計算從1到該數之間各整數的和. [root@localhost ~]# vi sumint.sh #!/bin/bash read -p "Input a number (>1): " UP i=1 sum=0 while [ $i -le $UP ] do sum=`expr $sum $i` i=`expr $i 1` done echo "The sum of 1-$UP is : $sum" [root@localhost ~]# sh sumint.sh Input a number (>1): 50 The sum of 1-50 is : 1275
批量添加20個系統用戶賬號,用戶名稱依次為“stu1”、“stu2”、“stu3”、……“stu20”,各用戶的初始密碼均設置為“123456”. [root@localhost ~]# vi add20users.sh #!/bin/bash i=1 while [ $i -le 20 ] do useradd stu$i echo "123456" | passwd --stdin stu$i &> /dev/null i=`expr $i 1` done [root@localhost ~]# sh add20users.sh [root@localhost ~]# tail -2 /etc/passwd stu19:541:541::/home/stu19:/bin/bash stu20:542:542::/home/stu20:/bin/bash
編寫一個批量刪除用戶的腳本程序,將上例中添加的20個用戶刪除. [root@localhost ~]# vi del20users.sh #!/bin/bash i=1 while [ $i -le 20 ] do userdel -r stu$i i=`expr $i 1` done [root@localhost ~]# sh del20users.sh [root@localhost ~]# grep "stu" /etc/passwd //無輸出則表示上述用戶已刪除





[火星人 via ] linux 編寫shell管理腳本02已經有171次圍觀

http://www.coctec.com/docs/linux/show-post-45779.html