編寫Shell腳本的簡單語法
提到編程,條件、分支、循環等語法肯定少不了。shell腳本編程亦是如此,下面只是結合最近學習的一些簡單語法做的筆記,如有錯誤,歡迎指正。
if條件語句
條件測試操作
test命令:
用途:測試特定的表達式是否成立,當條件成立時,命令執行後的返回值為0,否則為其它值
格式:test 條件表達式 或者
[ 條件表達式 ](注意:方括號[]和條件表達式語句之間至少需要一個空格)
常見的測試類型:測試文件狀態;字符串比較;整數值比較;邏輯測試
測試文件狀態:[ 操作符 文件或目錄 ]
常用的測試操作符
-d:測試是否為目錄(Directory)
-e:測試目錄或文件是否存在(Exist)
-f:測試是否為文件(File)
-r:測試當前用戶是否有權限讀取(Read)
-w:測試當前用戶是否有權限寫入(Write)
-x:測試當前用戶是否可執行(Excute)該文件
-L:測試是否為符號連接(Link)文件
如何判斷當前所在的工作目錄是否為 /usr/src? [ $PWD = “/usr/src” ] && echo “YES” || echo “NO”
[root@localhost ~]# [ -d /etc/vsftpd ] [root@localhost ~]# echo $? 0 ==>返回值為0,表示上一步測試的條件成立 [root@localhost ~]# [ -d /etc/hosts ] [root@localhost ~]# echo $? 1 [root@localhost ~]# [ -e /media/cdrom ] && echo "YES" ==>如果測試的條件成立則輸出“YES” YES [root@localhost ~]# [ -e /media/cdrom/Server ] && echo "YES“ [root@localhost ~]#
上述&&是“與”的意思,“… && echo YES”表示如果沒有輸出,則表示前面執行的測試條件不成立或命令出錯。(備注:l測試文件是否可寫(-w)時,不要以root用戶(特權用戶)的身份執行測試,否則可能會無法准確判斷)
整數值比較:[ 整數1 操作符 整數2 ]
常用的測試操作符
-eq:等於(Equal)
-ne:不等於(Not Equal)
-gt:大於(Greater Than)
-lt:小於(Lesser Than)
-le:小於或等於(Lesser or Equal)
-ge:大於或等於(Greater or Equal)
[root@localhost ~]# who | wc -l 5 [root@localhost ~]# [ `who | wc -l` -le 10 ] && echo "YES" ==>如果登錄用戶數小於或等於10則輸出YES YES [root@localhost ~]# df -hT | grep "/boot" | awk '{print $6}' 12% [root@localhost ~]# BootUsage=`df -hT | grep "/boot" | awk '{print $6}' | cut -d "%" -f 1`
解釋: df -hT 查看所有分區的磁盤空間使用情況
grep “/boot” 過濾出關於/boot分的數據行
awk ‘{print $6}’ 以空格為分隔符,只取第六個字段數據
cut -d “%” -f1 以%為分隔符,只取第一個字段數據
[root@localhost ~]# echo $BootUsage 12 [root@localhost ~]# [ $BootUsage -gt 95 ] && echo "YES" ==>如果/boot分區的磁盤使用率超過95%則輸出YES
條件測試操作:[ 字符串1 = 字符串2 ]
常用的測試操作符
=:字符串內容相同
!=:字符串內容不同,! 號表示相反的意思
-z:字符串內容為空
[root@localhost ~]# read -p "Location:" FilePath Location:/etc/inittab [root@localhost ~]# [ $FilePath = "/etc/inittab" ] && echo "YES" ==>如果鍵入路徑與指定的目錄一致則輸出YES YES [root@localhost ~]# [ $LANG != "en.US" ] && echo $LANG ==>如果當前的語言環境不是en_US,則輸出LANG變量的值 zh_CN.UTF-8
(字符串比較可以用於檢查用戶輸入,例如在提供交互式操作時,判斷用戶輸入的選擇項是否與指定的變量內容相匹配)
邏輯測試:[ 表達式1 ] 操作符 [ 表達式2 ]
常用的測試操作符
-a或&&:邏輯與,“而且”的意思(前後兩個表達式都成立時整個測試結果才為真,否則為假)
-o或||:邏輯或,“或者”的意思(操作符兩邊至少一個為真時,結果為真,否則結果為假)
!:邏輯否( 當指定的條件不成立時,返回結果為真)
[root@localhost ~]# echo $USER root [root@localhost ~]# [ $USER != "teacher" ] && echo "Not teacher" ==>如果發現用戶不是teacher,則提示“Not teacher” Not teacher [root@localhost ~]# [ $USER = "teacher" ] || echo "Not teacher" Not teacher
邏輯測試指的是:同時使用兩個(或多個)條件表達式時,判斷它們之間的關系
if語句結構——當“條件成立”時執行相應的操作
單分支:
if 條件測試命令
then 命令序列
fi
if語句簡單應用示例
#!/bin/bash temp=2 if [ $temp -eq 2 ] then echo 'temp is 2' fi
保存為test文件,並將它設置為可執行(+x)
[jzhou@localhost ~]# chmod 775 test
[jzhou@localhost ~]# bash test
temp is 2
(備注:lthen可以寫到與if一行,但要用分號隔開,例如: if [ $RATE -gt 80 ] ; then)
單分支:
if 條件測試命令
then 命令序列1
else 命令序列2
fi
判斷mysqld是否在運行,若已運行則輸出提示信息,否則重新啟動mysqld服務
#!/bin/bash service mysqld status &> /dev/null if [ $? -eq 0 ] ==>判斷上句是否執行成功 then echo "mysqld service is running." else /etc/init.d/mysqld restart fi
提示用戶輸入一個整數,如何判斷該值是否小於100? read “Input an integer:” NUM ; if [ $NUM -lt 100 ] ; then echo “小於100” else echo “大於或等於100” fi
多分支:
if 條件測試命令1 ; then
命令序列1
elif 條件測試命令2 ; then
命令序列2
elif ...
else
命令序列n
fi
for循環語句——根據變量的不同取值,重復執行一組命令操作
for語句的結構
for 變量名 in 取值列表
do
命令序列
done
for語句簡單應用示例
依次輸出3條文字信息,包括一天中的“Morning”、“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
示例2:獲得用戶的滿足條件的文件數
#!/bin/bash DIR="/opt" LMT=100 ValidUsers=`grep "/bin/bash" /etc/passwd | cut -d ":" -f 1` ==>獲得使用bash作為登錄shell的用戶名列表 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 have 6737 files. teacher have 344 files.