標籤:case file 管道 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迴圈裡面如果沒有在一次迴圈結束後重新賦值給這個變數那麼這個迴圈將變成死迴圈不會退出。必須要將迴圈條件變為假才可以結束迴圈。來看個例子吧
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/54/73/wKiom1SCySTTDDtUAAEbx15QkOc234.jpg" title="2014-12-06 17:15:04 的螢幕.png" alt="wKiom1SCySTTDDtUAAEbx15QkOc234.jpg" />
我將變數a定義為數值型並且初始值為0,下面的while迴圈條件是如果$a的值小於100則輸出hello我並沒有給修正運算式來修正$a的值,所以程式會一直輸出hello不會停止。如果要停止則可以按下ctrl+c即可停止指令碼
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/54/73/wKiom1SCyZXAC_eQAAFBCa9wCeU015.jpg" title="2014-12-06 17:16:52 的螢幕.png" alt="wKiom1SCyZXAC_eQAAFBCa9wCeU015.jpg" />
我們來修改一下指令碼增加一個修正運算式。我增加了一個 let a++讓程式迴圈一次那麼$a的值就加1直到$a的值大於100程式就結束了。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/54/73/wKiom1SCyf3iRm60AAEXzOcdo8I496.jpg" title="2014-12-06 17:18:31 的螢幕.png" alt="wKiom1SCyf3iRm60AAEXzOcdo8I496.jpg" />
再來看下程式的執行結果吧,正好100行內容因為是0-99,第100次的時候$a的值就不在小於100了就和100相等所以程式結束,所以說這個修正運算式必不可少否則就會陷入死迴圈,如果想做死迴圈下面還會講到一個更簡單的辦法。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/54/71/wKioL1SCyvuxL2IJAAF6_IcmXhQ597.jpg" title="2014-12-06 17:20:20 的螢幕.png" alt="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
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/54/72/wKioL1SC25Dx1yeGAAFD1YajoV8156.jpg" title="2014-12-06 17:41:08 的螢幕.png" alt="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
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/54/72/wKioL1SC3TTAcrdKAAEnGaJKe1c378.jpg" title="2014-12-06 18:38:12 的螢幕.png" alt="wKioL1SC3TTAcrdKAAEnGaJKe1c378.jpg" />
與0x01類似主要就是看一下檔案測試選項如何使用。這篇就寫到這裡了,可能內容有點少畢竟這些東西不只是看看就會了,還是希望能多操作
下一篇會講到case語句一個精簡的if語句,使用時經常是case語句中嵌套if語句來使用,當然這些迴圈控制語句都可以互相嵌套隨意調用的(在不出錯的情況下)。
本文出自 “Yxn” 部落格,請務必保留此出處http://jyxnt.blog.51cto.com/9581167/1587137
shell基礎及流程式控制制語句之一while迴圈