首先,判斷文件是否為目錄;如果不是目錄,則判斷文件是否存在;如果文件存在,則判斷文件是否具有讀寫執行的權限,通過則顯示 echo 語句;以上所有判定都不通過時,顯示 echo 語句。
可以使用邏輯操作符連接帶參數的判斷語句,也可以使用邏輯操作符將表達式和 shell 命令組合在一起。
case 也是一個流程控制結構,shell 中的 case 語句可以依據可包含通配符的模式測試字符串。通常可以使用 if-elif 語句配合 test 實現同樣的功能,但是當選擇數目過多時,就會體現出語句太長的局限性。
從語法中可以看出,任何 pattern 之間都可以由 | 分割的幾個模式組成,這種情況下 expression 匹配其中任意一個模式則執行相應語句。模式匹配按順序依次執行,知道匹配上為止,如果無法匹配,則不執行任何操作。
case 語句與 fi 語句一樣,結束時是通過字符串顛倒(reverse)。
判斷文件后綴,根據不同后綴選擇不同的讀取方式,最后一個 * 匹配所有其他匹配不上的形式,相當于 C 語言中的 default。
循環可以控制某些代碼的重復行為或允許對多個對象操作。
for 循環用于遍歷整個對象/數字列表,依次執行每個獨立對象/數字的循環內容,在 shell 腳本里,對象可以是命令行參數、文件名或者任何可以以列表格式建立的東西。
list 為名稱列表,在 for 循環中對名稱列表中的每個對象進行相應操作,可以通過命令/模式匹配等操作來獲取名稱列表。
兩個例子都可以遍歷 mp3 文件并且依次播放。但是使用 find 命令會層層深入文件夾依次查找,而直接列出只會包含當前目錄的文件夾。執行反單引號(``)之前的命令,引用結果作為字符串。for 循環中如果 in list 參數被省略,則默認為 in "$@",即命令行參數的引用列表。
shell 中的 while 和 until 循環與傳統語言中的 while 和 do/until 相似,它們允許代碼在某些條件為真(或直到為真)時重復運行。while 與 until 唯一的區別在于如何判斷 condition 的退出狀態。在 while 語句中當 condition 的退出狀態為真時循環繼續運行,否則退出循環;而 until 語句中當 condition 的退出狀態為真時循環退出,否則繼續運行。它們中的 condition,可以是簡單的命令/列表,或者是包含 && 或 || 連接的命令,與 if 語句中的 test 一樣。
在 shell 中經常使用 while true 或者 until false 來構建無限循環。continue 語句用于在循環體中提早開始下一輪循環,break 語句用于跳出整個循環,而 continue 與break 語句也彌補了 shell 中沒有 goto 的不足。在多層循環中,continue n 表示會把 n 層的剩余代碼都去掉,break n 表示退出 n 層循環。