日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

對(duì)話 UNIX,第 6 部分: 通過(guò)腳本實(shí)現(xiàn)操作的自動(dòng)化( 二 )


end
命令行上的每個(gè)空格分隔的字符串變成了位置參數(shù) , 包括所調(diào)用的腳本的名稱 。因此 , 命令 synch.zsh 只有一個(gè)位置參數(shù) $0 。synch.zsh --help 命令有兩個(gè)位置參數(shù):$0 和 $1 , 其中 $1 是字符串 --help 。
所以 , 清單 3 表示“如果第一個(gè)位置參數(shù)為空(-z 操作符測(cè)試空字符串)或(由 || 表示)如果第一個(gè)參數(shù)等于‘—help’ , 則打印用法信息 。(如果您剛開(kāi)始編寫腳本 , 可以考慮在每個(gè)腳本中提供用法信息作為提示 。它提醒其他人——甚至您自己 , 如果您忘了的話——如何使用該腳本 。)
短語(yǔ) [[ -z $1 || $1 == "--help" ]] 是 if 語(yǔ)句的 條件 , 但您也可以將同樣的條件子句用作命令 , 并將其與其他命令組合使用以控制通過(guò)腳本的流 。請(qǐng)查看清單 4 。它枚舉您的 $PATH 中的所有可執(zhí)行命令 , 并將條件與其他命令組合使用以執(zhí)行適當(dāng)?shù)墓ぷ?。
清單 4. 列出 $PATH 中的命令
#! /bin/zsh
DirectorIEs=(`echo $PATH | column -s ':' -t`)
for directory in $directories
do
 [[ -d $directory ]] || continue
 
 pushd "$directory"
 
 for file in *
 do
 [[ -x $file && ! -d $file ]] || continue
 echo $file
 done
 
 popd
done | sort | uniq
此腳本中執(zhí)行了相當(dāng)多的操作 , 我們將它細(xì)分為以下幾部分:
第一個(gè)實(shí)際腳本行——DirectorIEs=(`echo $PATH | column -s ':' -t`)——?jiǎng)?chuàng)建指定目錄的數(shù)組 。您在 zsh 中通過(guò)將參數(shù)放在括號(hào)中來(lái)創(chuàng)建數(shù)據(jù) , 例如 directories=(...) 。在此例中 , 數(shù)組元素是通過(guò)在每個(gè)冒號(hào)(column -s ':')處分拆 $PATH 以產(chǎn)生空格分隔的目錄列表(column 的 -t 參數(shù))來(lái)生成的 。
對(duì)于列表中的每個(gè)目錄 , 該腳本嘗試枚舉該目錄中的可執(zhí)行文件 。步驟 3 至步驟 6 描述了該過(guò)程 。
[[ -d $directory ]] || continue 行是所謂的 short-circuiting 命令的一個(gè)示例 。short-circuiting 命令在其邏輯條件產(chǎn)生確定的結(jié)果時(shí)立即終止 。例如 , [[ -d $directory ]] || continue 短語(yǔ)使用邏輯“或(||)——它首先執(zhí)行第一個(gè)命令 , 并且——當(dāng)且僅當(dāng)——第一個(gè)命令失敗時(shí)才執(zhí)行第二個(gè)命令 。因此 , 如果 $directory 中的條目存在 , 并且是一個(gè)目錄(-d 操作符) , 則測(cè)試成功 , 求值結(jié)束 , 并且 continue 命令(它跳過(guò)當(dāng)前元素的處理)永遠(yuǎn)不會(huì)執(zhí)行 。
然而 , 如果第一個(gè)測(cè)試失敗 , 則會(huì)執(zhí)行該邏輯的下一個(gè)條件或執(zhí)行 continue 。(continue 始終成功 , 因此它通常出現(xiàn)在 short-circuiting 命令的最后) 。
基于邏輯“與(&&) 的 Short-circuiting 首先執(zhí)行第一個(gè)命令 , 并且——當(dāng)且僅當(dāng)——第一個(gè)命令成功時(shí)才執(zhí)行第二個(gè)命令 。
pushd 和對(duì)應(yīng)的 popd 分別用于在處理前切換到新目錄和在處理后切換到先前的目錄 。使用目錄堆棧是一種理想的腳本技術(shù) , 用于維持您在文件系統(tǒng)中的位置 。
內(nèi)部的 for 循環(huán)枚舉當(dāng)前工作目錄中的所有文件——通配符 *(星號(hào))匹配所有條目——然后測(cè)試每個(gè)條目是否為文件 。[[ -x $file && ! -d $file ]] || continue 行表示“如果 $file 存在并且是可執(zhí)行文件而且不是目錄 , 則處理它;否則執(zhí)行 continue 。
最后 , 如果前面的所有條件都滿足 , 則使用 echo 來(lái)顯示文件名 。
您弄明白該腳本的最后一行了嗎?您可以將大多數(shù)控制結(jié)構(gòu)的輸出發(fā)送給另一個(gè) Unix 命令——畢竟 , Shell 將該控制結(jié)構(gòu)視為一個(gè)命令 。因此 , 整個(gè)腳本的輸出通過(guò) sort、然后通過(guò) uniq 進(jìn)行管道傳輸 , 以產(chǎn)生在您的 $PATH 中找到的唯一命令的字母排序列表 。
如果將清單 4 保存到一個(gè)名為 listcmds.zsh 的可執(zhí)行文件 , 則輸出可能類似如下:

推薦閱讀