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