歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> Linux操作系統學習筆記管理簡單shell語法(1)

Linux操作系統學習筆記管理簡單shell語法(1)

日期:2017/2/25 10:32:37   编辑:SHELL編程

編寫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. 

Copyright © Linux教程網 All Rights Reserved