上一篇Linux shell腳本基礎學習中我們講了Linux shell腳本中控制流程的if 、select、case ,這裡接著介紹Linux shell腳本控制流程的loop和引號,控制流程這部分內容比較多,還有一部分內容是關於here document的。
4.loop
loop表達式:
while ...; do .... done
while-loop 將運行直到表達式測試為真。 will run while the expression that we test for is true.
關鍵字"break" 用來跳出迴圈。而關鍵字”continue」用來不執行剩下的部分而直接跳到下一個迴圈。
for-loop表達式查看一個字串列表(字串用空格分隔) 然後將其賦給一個變數:
for var in ....; do .... done
在下面的例子中,將分別打印ABC到屏幕上:
#!/bin/sh for var in A B C ; do echo "var is $var" done
下面是一個更有用的腳本showrpm,其功能是列印一些RPM套件的統計資料:
#!/bin/sh # list a content summary of a number of RPM packages # USAGE: showrpm rpmfile1 rpmfile2 ... # EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpm for rpmpackage in $*; do if [ -r "$rpmpackage" ];then echo "=============== $rpmpackage ==============" rpm -qi -p $rpmpackage else echo "ERROR: cannot read file $rpmpackage" fi done
這裡出現了第二個特殊的變數$*,該變數包含了所有輸入的命令列參數值。
如果您執行showrpm openssh.rpm w3m.rpm webgrep.rpm
此時$* 包含了3 個字串,即openssh.rpm, w3m.rpm and webgrep.rpm.
5. 引號
在向程式傳遞任何參數之前,程式會擴展通配符和變數。這裡所謂擴充的意思是程式會把通配符(例如*)替換成適當的檔名,它變數替換成變數值。為了防 止程式作這種替換,您可以使用引號:讓我們來看一個例子,假設在當前目錄下有一些文件,兩個jpg文件, mail.jpg 和tux.jpg。
1.2 編譯SHELL腳本
#ch#!/bin/sh mod +x filename
cho *.jpg ∪緩螅梢醞釀ü淙耄?./filename 來執行您的腳本。
這將列印出"mail.jpg tux.jpg"的結果。
引號 (單引號和雙引號) 將防止這種通配符擴展:
#!/bin/sh echo "*.jpg" echo '*.jpg'
這將打印"*.jpg" 兩次。
單引號更嚴格一些。它可以防止任何變數擴展。雙引號可以防止通配符擴展但允許變數擴展。
#!/bin/sh echo $SHELL echo "$SHELL" echo '$SHELL'
運行結果為:
/bin/bash /bin/bash $SHELL
最後,還有一種防止這種擴展的方法,那就是使用轉義字符―反斜桿:
echo *.jpg echo $SHELL
這將輸出: