歡迎您光臨本站 註冊首頁

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”是否為目錄,並通過“$?”變數查看返回狀態值,據此判斷測試結果. [[email protected] ~]# [ -d /etc/vsftpd ] [[email protected] ~]# echo $? 0 [[email protected] ~]# [ -d /etc/hosts ] [[email protected] ~]# echo $? 1 [[email protected] ~]# 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”,否則不輸出任何信息. [[email protected] ~]# [ -e /media/cdrom/Server ] && echo "YES" //無輸出表示該目錄不存在 [[email protected] ~]# [ -e /media/cdrom ] && echo "YES" YES //顯示YES表示該目錄存在
使用普通用戶teacher登錄,並測試是否對“/etc/passwd”文件有讀、寫許可權,如果是則顯示“YES”. [[email protected] ~]$ [ -w /etc/passwd ] && echo "YES" [[email protected] ~]$ [ -r /etc/passwd ] && echo "YES" YES
測試當前登錄到系統中的用戶數量是否小於或等於10,是則輸出“YES”. [[email protected] ~]$ who | wc -l 2 [[email protected] ~]$ [ `who | wc -l` -le 10 ] && echo "YES" YES
提取出“/boot”分區的磁碟使用率,並判斷是否超過95%(為了便於理解,操作步驟以適當進行分解). [[email protected] ~]# df -hT | grep "/boot" | awk '{print $6}' [[email protected] ~]# read -p "Localtion: " FilePath Localtion: /etc/inittab [[email protected] ~]# [ $FilePath = "/etc/inittab" ] && echo "YES" YES
若當前環境變數LANG的內容不是“en.US”,則輸出LANG變數的值,否則無輸出. [[email protected] ~]# [ $LANG != "en.US" ] && echo $LANG zh_CN.UTF-8
使用touch命令建立一個新文件,測試其內容是否為空,向文件中寫入內容后,再次進行測試. [[email protected] ~]# touch zero.file [[email protected] ~]# [ -z 'cat zero.file' ] && echo "YES" YES //表示該文件為空文件 [[email protected] ~]# [ -z 'cat zero.file' ] && echo "YES" [[email protected] ~]# echo "something" > zero.file [[email protected] ~]# [ -z 'cat zero.file' ] && echo "YES" //無輸出表示文件不為空
測試當前的用戶是否是teacher,若不是則提示“Not teacher”. [[email protected] ~]# echo $USER root [[email protected] ~]# [ $USER = "teacher" ] || echo "Not teacher" Not teacher
只要“/etc/rc.d/rc.local”或者“/etc/init.d/rc.local”中有一個是文件,則顯示“YES”,否則無任何輸出. [[email protected] ~]# [ -f /etc/rc.d/rc.local ] || [ -f /etc/init.d/rc.local ] && echo "YES" YES
測試“/etc/profile” 文件是否有可執行許可權,若確實沒有可執行許可權,則提示“No x mode.”的信息. [[email protected] ~]# [ ! -x "/etc/profile" ] && echo "No x mode." No x mode.
若當前的用戶是root且使用的shell程序是“/bin/bash”, 則顯示“YES”,否則無任何輸出. [[email protected] ~]# echo $USER $SHELL root /bin/bash [[email protected] ~]# [ $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”文件是否存在,若存在則統計文件內容的行數並輸出,否則不做任何操作(合理使用變數,可以提高編寫效率). [[email protected] ~]# vi chklog.sh #!/bin/bash LogFile="/var/log/messages" if [ -f $LogFile ] ; then wc -l $LogFile fi [[email protected] ~]# sh chklog.sh 1005 /var/log/messages
提示用戶指定備份目錄的路徑,若目錄已存在則顯示提示信息后跳過,否則顯示相應提示信息后創建該目錄. [[email protected] ~]# 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 [[email protected] ~]# sh mkbak.sh What is your backup directory: /opt/bakroot /opt/bakroot is not exist, will make it. [[email protected] ~]# ls -ld /opt/bakroot/ drwxr-xr-x. 2 root root 4096 11?.17 19:30 /opt/bakroot/
統計當前登錄到系統中的用戶數量,並判斷是否超過三個,若是則顯示實際數量並給出警告信息,否則列出登錄的用戶賬號名稱及所在終端. [[email protected] ~]# 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 [[email protected] ~]# 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.”. [[email protected] ~]# 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 [[email protected] ~]# sh chkportmap.sh no portmap script file.
每隔五分鐘監測一次mysqld服務進程的運行狀態,若發現mysqld進程已終止,則在“/var/log/messages”文件中追加寫入日誌信息(包括當時時間),並重啟mysqld服務;否則不進行任何操作. [[email protected] ~]# 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 [[email protected] ~]# sh chkportmap.sh [[email protected] ~]# tail -1 /var/log/messages At time: 2011 年 11 月 18 日 星期五 20:16:31 CST : MySQL server is down. [[email protected] ~]# crontab –e //需確認crond服務已運行 */5 * * * * /root/chkdbsvr.sh
二、for語句
根據變數的不同取值,重複執行一組命令操作

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


依次輸出三條文字信息,包括一天中的“Moring”、“Noon”、“Evening”字串. [[email protected] ~]# vi showday.sh #!/bin/bash for TM in "Morning" "Noon" "Evening" do echo "The $TM of the day. " done [[email protected] ~]# sh showday.sh The Morning of the day. The Noon of the day. The Evening of the day.
對於使用“/bin/bash”作為登錄shell的系統用戶,檢查他們在“/opt”目錄中擁有的子目錄或文件數量,如果超過100個,則列出具體數值及對應的用戶賬號. [[email protected] ~]# 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 [[email protected] ~]# sh chkfileown.sh [[email protected] ~]# find -user root | wc -l 40
計算“/etc”目錄中所有“*.conf”形式的配置文件所佔用的總空間大小. [[email protected] ~]# 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. " [[email protected] ~]# sh confsize.sh Total size of conf files: 813 bytes. 三、while語句
重複測試指定的條件,只要條件成立則反覆執行對應的命令操作

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

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

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

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