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

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


$ ./listcmds.zsh
[
a2p
ab
ac
accept
accton
aclocal
short-circuiting 命令在腳本中非常有用 。它在單個(gè)命令中組合了條件和操作 。而且由于每個(gè) UNIX 命令都返回一個(gè)指示成功或失敗的狀態(tài)代碼 , 因此 , 您可以使用任何命令作為“條件——而不僅僅是使用測(cè)試操作符 。根據(jù)約定 , UNIX 返回零 (0) 表示成功 , 返回非零表示失敗 , 其中非零值反映所發(fā)生的錯(cuò)誤類型 。
例如 , 如果將 [[ -d $Directory ]] || continue 行替換為 cd $directory || continue , 則可以從清單 4 中消除 pushd 和 popd 。如果 cd 命令成功 , 則它會(huì)返回 0 , 并且邏輯“或的求值可以立即結(jié)束 。然而 , 如果 cd 失敗 , 則它會(huì)返回非零 , 并且會(huì)執(zhí)行 continue 。
不要?jiǎng)h除 。應(yīng)存檔!
現(xiàn)代 UNIX Shell——bash、ksh、zsh——提供了許多控制結(jié)構(gòu)和操作以創(chuàng)建復(fù)雜的腳本 。由于您可以調(diào)用所有 UNIX 命令來(lái)將數(shù)據(jù)從一種形式處理為另一種形式 , Shell 腳本編程幾乎與諸如 C 或 Perl 等完整語(yǔ)言中的編程一樣豐富 。
您可以使用腳本來(lái)自動(dòng)化幾乎所有個(gè)人或系統(tǒng)任務(wù) 。腳本可以監(jiān)視、存檔、更新、上載、下載和轉(zhuǎn)換數(shù)據(jù) 。一個(gè)腳本可以只有單行或包括無(wú)數(shù)個(gè)子系統(tǒng) 。任務(wù)無(wú)論大小 , 均可通過(guò)腳本來(lái)處理 。實(shí)際上 , 如果您查看 /etc/init.d 目錄 , 會(huì)看到在每次啟動(dòng)計(jì)算機(jī)時(shí)運(yùn)行服務(wù)的各種 Shell 腳本 。如果您創(chuàng)建了一個(gè)非常有用的腳本 , 您甚至可以將它部署為系統(tǒng)范圍的實(shí)用程序 。只需將其放到用戶的 $PATH 上的某個(gè)目錄中 。
讓我們創(chuàng)建一個(gè)實(shí)用程序 , 以練習(xí)您新發(fā)現(xiàn)的訣竅 。腳本 myrm 將替換系統(tǒng)自己的 rm 實(shí)用程序 。與徹底刪除某個(gè)文件不同 , myrm 把要?jiǎng)h除的文件復(fù)制到某個(gè)存檔 , 對(duì)其進(jìn)行唯一命名以便您以后能夠找到它 , 然后再刪除原始文件 。myrm 腳本有效但是非常簡(jiǎn)單 , 并且您還可以添加許多雜項(xiàng)功能 。您還可以編寫(xiě)一個(gè)廣泛的 unrm(撤銷刪除)腳本作為配套實(shí)用程序 。(您可以搜索 Internet 來(lái)找到各種各樣的實(shí)現(xiàn) 。)
myrm 腳本如清單 5 所示 。
清單 5. 用于在從文件系統(tǒng)中刪除文件之前備份該文件的簡(jiǎn)單實(shí)用程序
#! /bin/zsh
backupdir=$HOME/.tomb
systemrm=/bin/rm
if [[ -z $1 || $1 == "--help" ]]
then
 exec $systemrm
fi
if [[ ! -d $backupdir ]]
then
 mkdir -m 0700 $backupdir || echo "$0: Cannot create $backupdir"exit
fi
args$=$( getopt dfiPRrvw $* ) || exec $systemrm
count=0
flags = ""
foreach argument in $args
do
 case $argument in
--) break;
;;
*) flags="$flags $argument";
(( count=$count1 ));
;;
 esac
done
shift $(( $count ))
for file
do
 [[ -e $file ]] || continue
 copyfile=$backupdir/$(basename $file).$(date " %m.%d.%y.%H.%M.%S")
 /bin/cp -R $file $copyfile
done
exec $systemrm $=flags "$@"
您應(yīng)該發(fā)現(xiàn)該 Shell 腳本很容易理解 , 盡管其中存在一些之前尚未討論過(guò)的新內(nèi)容 。讓我們探討一下那些新內(nèi)容 , 然后查看整個(gè)腳本 。
當(dāng) Shell 運(yùn)行某個(gè)命令(如 cp 或 ls)時(shí) , 它會(huì)為該命令產(chǎn)生一個(gè)新進(jìn)程 , 然后在繼續(xù)之前等待該(子)進(jìn)程完成 。exec 命令還啟動(dòng)另外一個(gè)命令 , 但是與產(chǎn)生新進(jìn)程不同 , exec 使用一個(gè)新命令來(lái)“替換當(dāng)前進(jìn)程——即 Shell 進(jìn)程——的任務(wù) 。換句話說(shuō) , exec 重用同一進(jìn)程來(lái)啟動(dòng)一個(gè)新任務(wù) 。在該腳本的上下文中 , exec 立即“終止該腳本并啟動(dòng)指定的任務(wù) 。
Unix 實(shí)用程序 getopt 掃描位置參數(shù)以獲得您指定的命名參數(shù) 。這里 , dfiPRrvw 列表查找 -d、-f、-i、-P、-R、-r、-v 和 -w 。如果出現(xiàn)別的選項(xiàng) , 則 getopt 將會(huì)失敗 。否則 , getopt 返回一個(gè)以特殊字符串 -- 結(jié)尾的選項(xiàng)字符串 。

推薦閱讀