歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> SHELL程序結構化設計

SHELL程序結構化設計

日期:2017/3/1 10:38:20   编辑:SHELL編程

本文沒有高深知識,只談shell的可讀性,可理解性。我的工作中涉及到閱讀一些shell程序,在閱讀過程中,我發現很多所謂大牛寫下來的程序沒有結構,本文以舉例形式來描述。

假如存在以下一些函數:函數A的功能是與讀取員工信息文件(包含考勤信息和其他信息),並獲取公司員工的考勤信息;函數B的功能是根據員工的考勤信息計算員工的工資;函數C、D實現其他功能。而我所看到的絕大部分腳本中的實現方式是:

#函數A,沒有任何參數
A( )
{
StaffMsg=·cat StaffMsg.txt`
#解析StaffMsg.txt獲取考勤信息:AttendanceMsg的代碼行
echo ”$AttendanceMsg“>AttendanceMsg.txt
}
#函數B,沒有任何參數
B( )
{
AttendanceMsg=`cat AttendanceMsg.txt`
#計算工資(Wage)的代碼
echo $Wage > Wage.txt
}
#主過程,不向函數A和B傳遞任何參數
#*******************main*******************
#調用A函數獲取員工考勤數據
A
#緊跟著有多個其他函數的調用
C
D
……
#執行函數B計算工資
B
#其他代碼:
……
#刪除臨時文件:
rm -rf AttendanceMsg.txt
#主過程結束

在閱讀以上代碼中的B函數調用時,我相信大家都會納悶B中的msg=·cat temp_file.txt`是哪裡來的,有時候不得不在腳本中Ctrl+F來搜索,好不容易才找到它是A中產生的,函數A中的StaffMsg.txt也給人一種憑空出現的感覺,最要命的是主過程中刪除文件那行代碼,他刪除的是其他函數定義(產生)的文件,讓人更是莫名其妙。這樣的代碼不僅難讀懂,而且函數B與函數A是通過文件強耦合的,強耦合為什麼不好,這個我想大家都知道(其實是我說不太清楚);其實以上幾個函數根本就不是函數,而是一些代碼塊,這樣的設計還不如整個腳本沒有函數好。那麼有什麼辦法既能提高可讀性,又能降低耦合呢,很簡單:通過參數傳遞,模仿C++,用傳入參數和傳出參數,請看:
#函數A,兩個參數,一個傳入參數:接收員工信息,一個傳出參數:輸出員工考勤信息
A( )
{
StaffMsgFile=$1
AttendanceMsgFile=$2#通過傳出參數來保存員工考勤信息
StaffMsg=·cat $StaffMsgFile`
#解析StaffMsg.txt獲取考勤信息:AttendanceMsg的代碼行
echo ”$AttendanceMsg“> $AttendanceMsgFile
}
#函數B,兩個參數,一個傳入參數:接收員工考勤信息,一個傳出參數:輸出員工工資信息
B( )
{
AttendanceMsgFile=$1
WageFile=$2
AttendanceMsg=`cat $AttendanceMsgFile`
#計算工資(Wage)的代碼
echo $Wage > $WageFile
}
#主過程,向函數A和B傳遞兩種參數:傳入參數和傳出參數
#*******************main*******************
#定義員工信息文件變量和員工考勤信息文件變量
Staff_Info_File="StaffMsg.txt"
Attendance_Info_File="AttendanceMsg.txt"
#調用A函數獲取員工考勤數據,並保存到變量Attendance_Info_File指示的文件中
A "$Staff_Info_File" "$Attendance_Info_File"
#緊跟著有多個其他函數的調用
C
D
……
#定義員工工資信息文件變量
Wage_File="Wage.txt"
#執行函數B計算工資,並保存結果到變量Wage_File指示的文件中
B "$Attendance_Info_File" "$Wage_File"
#其他語句
……
#刪除臨時文件
rm -rf $Attendance_Info_File
#主過程結束

以上代碼是否是更加清晰呢?我希望你的回答是肯定的

更進一步:
我們知道在C++中,通常需要對函數參數做合法性檢查,shell中通常也需要,最起碼應該對參數個數做檢查,這樣可以避免誤調用。對參數個數檢查的代碼可寫成如下的樣子:
standard_num=2
if [ $# -ne &standard_num ] ; then
echo "錯誤信息"
return 1
fi

Copyright © Linux教程網 All Rights Reserved