shell 腳本編程在UNIX和Linux下的不同表現(xiàn)
shell 腳本編程如何才能更好的使用呢?尤其是在UNIX操作系統(tǒng)和Linux操作系統(tǒng)中的使用。接下來我們就看看有關(guān)shell 腳本編程的相關(guān)使用問題。
與其他 UNIX 操作系統(tǒng)和 Linux 一樣,IBM? AIX? 操作系統(tǒng)提供了幾種能夠幫助系統(tǒng)管理員、開發(fā)人員和用戶執(zhí)行日常任務(wù)的強(qiáng)大工具,使他們或其客戶的工作更輕松。在 UNIX 中,這些工具之一能夠通過編寫 shell 腳本編程來自動(dòng)執(zhí)行任務(wù),從而簡(jiǎn)化那些困難、漫長(zhǎng)或繁瑣的工作。
盡管在近兩年使用過 UNIX 的一些人可能嘗試過 shell 腳本編程,但是他們很可能只是研究操作系統(tǒng)的細(xì)節(jié),并不精通 shell 腳本編程。本文針對(duì)那些希望進(jìn)一步了解 shell 腳本編程,并開始編寫更高級(jí)腳本的讀者。本文提供腳本編程的基礎(chǔ)知識(shí),包括如何簡(jiǎn)化腳本、如何盡可能保持腳本的靈活性、如何編寫干凈的腳本、在腳本內(nèi)編寫注釋以及調(diào)試腳本。
shell 腳本編程保持簡(jiǎn)單
在人們學(xué)習(xí)如何編寫 shell 腳本編程時(shí),常常遇到的一個(gè)問題是,重復(fù)他們?cè)诹硪粋€(gè)腳本中已經(jīng)做過的工作。他們其實(shí)不需要復(fù)制原來的腳本并修改幾個(gè)硬編碼值,只需創(chuàng)建一個(gè)函數(shù)來處理兩個(gè)腳本的重復(fù)部分。創(chuàng)建集中的函數(shù)還可以促進(jìn)標(biāo)準(zhǔn)化,幫助創(chuàng)建統(tǒng)一的腳本。如果一個(gè)函數(shù)在腳本的一個(gè)部分工作正常,那么它在腳本中的其他地方也會(huì)正常工作。
例如,清單 1 所示的腳本應(yīng)該濃縮和簡(jiǎn)化為更簡(jiǎn)單、更干凈的程序。
清單 1. 可以簡(jiǎn)化的腳本示例
- #!/usr/bin/ksh
- if [[ $# -lt 2 ]]
- then
- echo "Usage: ${0##*/} <file name #1> <file name #2>
- exit 0
- fi
- if [[ ! -f "${1}" ]]
- then
- echo "Unable to find file '${1}'"
- exit 1
- fi
- if [[ ! -r "${1}" ]]
- then
- echo "Unable to read file '${1}'"
- exit 2
- fi
- gzip ${1}
- ls -l ${1}.gz
- if [[ ! -f "${2}" ]]
- then
- echo "Unable to find file '${2}'"
- exit 1
- fi
- if [[ ! -r "${2}" ]]
- then
- echo "Unable to read file '${2}'"
- exit 2
- fi
- gzip ${2}
- ls -l ${2}.gz
這個(gè)腳本看起來很糟糕?。ㄖx天謝地,它只是一個(gè)示例)。這個(gè)shell 腳本編程應(yīng)該盡可能進(jìn)行濃縮。從便于閱讀的角度來看,清單 2 提供的版本更干凈。
清單 2. 對(duì)清單 1 腳本進(jìn)行濃縮的版本
- #!/usr/bin/ksh
- exit_msg() {
- [[ $# -gt 1 ]] && echo "${0##*/} (${1}) - ${2}"
- exit ${1:-0}
- }
- [[ $# -lt 2 ]] && exit_msg 0 "Usage: ${0##*/} <file name #1> <file name #2>
- for _FNAME in $@
- do
- [[ ! -f "${_FNAME}" ]] && exit_msg 1 "Unable to find file '${_FNAME}'"
- [[ ! -r "${_FNAME}" ]] && exit_msg 2 "Unable to read file '${_FNAME}'"
- gzip ${_FNAME}
- ls -l ${_FNAME}.gz
- done
注意到這兩者的差異了嗎?這個(gè)shell 腳本編程增加了一個(gè)簡(jiǎn)單的函數(shù)來顯示一個(gè)消息并帶適當(dāng)?shù)姆祷卮a退出,還把所有操作轉(zhuǎn)移到一個(gè) for 循環(huán)中,這使這個(gè)腳本看起來更干凈、更容易理解了。
【編輯推薦】