這是我寫BASH程序的招式。這里本沒有什么新的內容,但是從我的經驗來看,人們愛濫用BASH。他們忽略了計算機科學,而從他們的程序中創造的是“大泥球”(譯注:指架構不清晰的軟件系統)。
在此我告訴你方法,以保護你的程序免于障礙,并保持代碼的整潔。
一、不可改變的全局變量
1.盡量少用全局變量
2.以大寫命名
3.只讀聲明
4.用全局變量來代替隱晦的$0,$1等
在我的程序中常使用的全局變量:
 代碼如下:
readonly PROGNAME=$(basename $0)
readonly PROGDIR=$(readlink -m $(dirname $0))
readonly ARGS="$@"
二、一切皆是局部的
所有變量都應為局部的。
 代碼如下:
change_owner_of_file() {
    local filename=$1
    local user=$2
    local group=$3
    chown $user:$group $filename
}
change_owner_of_files() {
    local user=$1; shift
    local group=$1; shift
    local files=$@
    local i
    for i in $files
    do
        chown $user:$group $i
    done
}
1.自注釋(self documenting)的參數
2.通常作為循環用的變量i,把它聲明為局部變量是很重要的。
3.局部變量不作用于全局域。
 代碼如下:
kfir@goofy ~ $ local a
bash: local: can only be used in a function
三、main()
1.有助于保持所有變量的局部性
2.直觀的函數式編程
3.代碼中唯一的全局命令是:main
 代碼如下:
main() {
    local files="/tmp/a /tmp/b"
    local i
    for i in $files
    do
        change_owner_of_file kfir users $i
    done
}
main
四、一切皆是函數
唯一全局性運行的代碼是:
- 不可變的全局變量聲明
- main()函數
1.保持代碼整潔
2.過程變得清晰
 代碼如下:
main() {
    local files=$(ls /tmp | grep pid | grep -v daemon)
}
 代碼如下:
temporary_files() {
    local dir=$1
    ls $dir /
        | grep pid /
        | grep -v daemon
}
main() {
    local files=$(temporary_files /tmp)
}
1.第二個例子好得多。查找文件是temporary_files()的問題而非main()的。這段代碼用temporary_files()的單元測試也是可測試的。
2.如果你一定要嘗試第一個例子,你會得到查找臨時文件以和main算法的大雜燴。
新聞熱點
疑難解答