shell基礎及流程控制語句之一while循環

        前面寫過if條件判斷,一般在寫shell腳本時可能會用到死循環這時就需要while語句了,它是做死循環最好的方法,在講while循環之前需要講文件測試,因爲在寫腳本時經常會用到。

        文件測試:

            -e $file:判斷是否存在如果存在則爲真,不存在則爲假

            -f $file:判斷是否存在並且爲普通文件,存在爲真,不存在爲假

            -d $file:判斷是否存在並且爲目錄,存在爲真不存在爲假

            -h $file:判斷是否存在並且爲符號鏈接文件(軟連接),存在爲真,不存在爲假

            -L $file:與-h一樣不做解釋

            -b $file:判斷是否存在並且爲塊設備文件,存在爲真,不存在爲假

            -c $file:判斷是否存在並且爲字符設備文件,存在爲真,不存在爲假

            -s $file:判斷是否存在並且爲套接字文件,存在爲真,不存在爲假

            -p $file:判斷是否存在並且爲管道文件,存在爲真,不存在爲假

            -r $file:判斷當前用戶是否對此文件有讀取的權限

            -w $file:判斷當前用戶是否對此文件有寫權限

            -x $file:判斷當前用戶是否對此文件有執行的權限

            -u $file:判斷文件是否擁有suid的權限

            -g $file:判斷文件是否擁有sgid的權限

            -k $file:文件是否擁有sticky權限

            -O $file:當前用戶是否爲文件的屬主

            -G $file:當前用戶是否爲文件的屬組

            -N $file:文件自從上一次被讀取之後是否被修改過

        感覺好多啊。。我現在寫腳本還沒有全部用過,我全部都做筆記了,因爲感覺以後會用到並且如果忘記了不用×××上google。

        接下來就說一下while循環吧,先將普通循環與for類似。

        固定格式爲:

        while 循環條件;do

        循環內容

        修正循環變量的表達式

        done

        之所以會有這個修正循環變量的表達式,是因爲在while循環裏面如果沒有在一次循環結束後重新賦值給這個變量那麼這個循環將變成死循環不會退出。必須要將循環條件變爲假纔可以結束循環。來看個例子吧

wKiom1SCySTTDDtUAAEbx15QkOc234.jpg

        我將變量a定義爲數值型並且初始值爲0,下面的while循環條件是如果$a的值小於100則輸出hello我並沒有給修正表達式來修正$a的值,所以程序會一直輸出hello不會停止。如果要停止則可以按下ctrl+c即可停止腳本

wKiom1SCyZXAC_eQAAFBCa9wCeU015.jpg

        我們來修改一下腳本增加一個修正表達式。我增加了一個 let a++讓程序循環一次那麼$a的值就加1直到$a的值大於100程序就結束了。

wKiom1SCyf3iRm60AAEXzOcdo8I496.jpg

        再來看下程序的執行結果吧,正好100行內容因爲是0-99,第100次的時候$a的值就不在小於100了就和100相等所以程序結束,所以說這個修正表達式必不可少否則就會陷入死循環,如果想做死循環下面還會講到一個更簡單的辦法。

wKioL1SCyvuxL2IJAAF6_IcmXhQ597.jpg

        對了,上面列出來的文件測試都是在條件判斷裏面寫的就像[  -f /etc/passwd  ] 這樣就是判斷/etc/passwd是否存在並且爲普通文件才往下繼續執行。

        死循環很簡單它的格式爲:

        while true;do

            循環內容

        done

        如果還用上面的示例的話寫出來的內容則爲:

        while true;do

                echo "hello"

        done

        一般死循環用於與用戶交互例如用戶輸入一個錯誤的內容程序則一直提示他請輸入內容這就用到了死循環。死循環也可以退出,當然是在特定條件下比如用戶輸入正確的內容後就可以執行下面的內容或者退出腳本。

        循環控制命令:break、continue、exit    

        break:提前退出循環

        continue:退出當前循環,直接進入下一次循環

        exit:腳本碰到eixt時不管接下來要做什麼直接退出腳本

用實例來講解吧:

0x01:判斷某用戶是否登陸,如果登陸了則輸出用戶登陸並且退出腳本,如果沒有登陸則進行循環。

        $!/bin/bash

        while true;do

        if  who | grep "test" &> /dev/null ;then

            echo "user test is logging"

            break

        fi

        done

wKioL1SC25Dx1yeGAAFD1YajoV8156.jpg

        在這裏test用戶如果不登陸則程序一直不退出直到test用戶登陸後程序返回user test is logging然後退出。

0x02:判斷/tmp/root.txt文件是否存在,如果存在則輸出"file is found",否則則進行循環直到文件存在

        while true;do    

            if [ -f /tmp/root.txt ];then

            echo "file is found"

            break

            fi

        done

wKioL1SC3TTAcrdKAAEnGaJKe1c378.jpg

        與0x01類似主要就是看一下文件測試選項如何使用。這篇就寫到這裏了,可能內容有點少畢竟這些東西不只是看看就會了,還是希望能多操作

        下一篇會講到case語句一個精簡的if語句,使用時經常是case語句中嵌套if語句來使用,當然這些循環控制語句都可以互相嵌套隨意調用的(在不出錯的情況下)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章