1. 程式人生 > >用shell實現一個小指令碼,用來同來統計自己某個檔案下的程式碼,總的程式碼行數,總的註釋量,總的空行量?支援遍歷查詢,支援軟連結查詢

用shell實現一個小指令碼,用來同來統計自己某個檔案下的程式碼,總的程式碼行數,總的註釋量,總的空行量?支援遍歷查詢,支援軟連結查詢

[[email protected] yunwei]# cat sum_code_row_version1.4.sh
#!/bin/bash
# File Name: sum_code_row.sh
# Author: Liwqiang
# mail: [email protected]
# Created Time: Sun 05 Aug 2018 06:43:19 PM CST
# Desc: 統計某個目錄下的程式碼總量(以遞迴的方式遍歷目錄查詢)、註釋總量、空行總量等,並輸出有意思的內容。。

#統計一個資料夾中的所有程式碼的之和
#即:統計下自己在coding學習中總共付出多少汗水?
#最後計算下,有效程式碼的數量=程式碼總量的75%

##定義函式,用遞迴的方式遍歷目錄,以查詢程式碼總量,程式碼指令碼的時間戳,以及註釋行和空行的總量等。
function auto_sum() {
			for i in `ls $1`;do
				#如果是目錄,則自動儲存在陣列中,然後遞迴
				if [ -d "$1/$i" ]; then
					dir_array[j]="$1/$i"   #把子目錄中的目錄儲存在陣列中
					let j++
#測試用				echo "$1/$i"
					auto_sum "$1/$i"
				#如果是檔案或者是有效的符號連結則統計程式碼行數
				elif [ -f "$1/$i" -o -L "$1/$i" -a -e "$1/$i" ]; then
					##記錄每個檔案的修改(modify)的時間戳,儲存在陣列timestamp[]中				
					timestamp[m]=$(stat "$1/$i"| awk -F'[ .]+' '/^Modify/{cmd="date +%s -d"$2;system(cmd)}')
					let m++
					let valid_num+=`sed -r '/^$|^#/d' $1/$i |wc -l`   #統計有用的程式碼行
					let null_num+=`sed  '/^$/!d' $1/$i |wc -l`		#統計空行
				#統計註釋行(每行的開頭是//,#,/*,",,則為註釋行)
					let comment_num+=`sed -r '/^#|^\/\/|^\"|^\/\*/!d' $1/$i |wc -l`	
				#既不是檔案,也不是目錄的,則放在else_array陣列中
				else
					else_array[k]="$1/$i"
					let k++
				fi
			done
}
##定義主函式
function main(){
		echo '````````````````````````````````````````````````````````````````````'
		echo '````````````````````````````````````````````````````````````````````'
		echo '此指令碼用來統計某個目錄下的指令碼的有效程式碼行數(遞迴的方式),步驟如下:'
		echo -e "第一步: 分別統計所有以#開頭的註釋行\t空行\t程式碼行"
		echo '第二步: 計算有效程式碼行。其計算公式為: 有效程式碼行=程式碼總行*75%'
		echo -e "最後分別輸出:  註釋行\t空行\t程式碼行"
		echo '````````````````````````````````````````````````````````````````````'
		echo '````````````````````````````````````````````````````````````````````'

		read -p'請輸入您想統計目錄的路徑,預設為統計當前目錄'  path
		#處理下使用者輸入的路徑,如果末尾帶‘/’,則自動刪除最後的‘/’
		path=`echo $path |sed -r 's/(.+)\/$/\1/g'`  
		echo '結果統計中....請耐心等待..........`'
		auto_sum $path
		echo '統計結果如下'
		echo '``````````````````````````````````````````'
	##把使用者的文件的修改時間排序,取最小值
		first_time=`echo ${timestamp[@]}|tr ' ' '\n' | sort -n |head -1`
	##把使用者的文件的修改時間排序,取最大值
		last_time=`echo ${timestamp[@]} |tr ' ' '\n' | sort -n |tail -1`
	##把時間戳,換算成標準的yyyy-mm--dd格式的日期
		change_first_time=`date -d @${first_time} +%F`
	##把時間戳,換算成標準的yyyy-mm--dd格式的日期
		change_last_time=`date -d @$last_time +%F`
		echo -e "總共有效文件數:\t${#timestamp[@]}"
		echo -e "最早的的修改時間:\t$change_first_time"
		echo -e "最後的修改時間為:\t$change_last_time"
	##計算時間跨度,即最晚的時間減去最早的時間的差值
		let cross=($last_time-$first_time)/86400
		echo -e "時間跨度:\t$cross  天"
		echo '``````````````````````````````````````````'
		echo '``````````````````````````````````````````'
		echo "其中包含${#dir_array[@]}個子目錄,還有${#else_array[@]}個非普通檔案"
		echo -e "其中目錄:\t${dir_array[@]}"
		echo -e "其他檔案:\t${else_array[@]}"
		echo '``````````````````````````````````````````'
		echo '``````````````````````````````````````````'
	##計算有效程式碼行,其公式為:程式碼總行的75%
		let valid_code_row=$valid_num*75/100
		let mix_code_comment_num=$comment_num+$valid_num
		echo "關於程式碼行數量的統計如下..."
		echo '``````````````````````````````````````````'
		echo -e "空行.......總量:\t${null_num}"
		echo -e "註釋行.....總量:\t$comment_num"
		echo -e "註釋行+程式碼總量:\t$mix_code_comment_num"
		echo -e "程式碼.......總量:\t$valid_num"
		echo -e "有效程式碼...總量:\t$valid_code_row"
		echo '``````````````````````````````````````````'
	##計算總的空行量/總的程式碼量,用來衡量整體的結構,條例性等。畢竟:適當的空行會讓程式碼更清晰易懂。
		let beauty=${null_num}*100/$valid_num
		let easy_reading=$comment_num*100/$valid_num
		if [ $beauty -ge 14 -a $beauty -le 20 ]; then
			is_beauty='尚可,,空行是不是可以精簡一點點呢?'
		elif [ $beauty -ge 8 -a $beauty -lt 14 ]; then
			is_beauty='完美,適當的空行令您的程式碼清晰易懂'
		elif [ $beauty -ge 20 -a $beauty -le 30 ]; then
			is_beauty='一般,空行有點多了。。'
		elif [ $beauty -ge 0 -a $beauty -lt 8 ]; then
			is_beauty='很一般,空行太少了。。適當的加一些空行,有助於提高可讀性。。'
		else
			is_beauty='沒有美感,,空行實在太多了,已經超過了程式碼量的30%,,兄弟!!!'
		fi
		if [ $easy_reading -ge 15 -a $easy_reading -le 25 ]; then
			is_easy_reading='還行吧,註釋量在10%左右。。'
		elif [ $easy_reading -ge 8 -a $easy_reading -lt 15 ]; then
			is_easy_reading='不好讀,註釋太少了。。。'
		elif [ $easy_reading -gt 25 ]; then
			is_easy_reading='太高了,兄弟您這確定您是在寫程式碼,而不是在寫註釋?'
		else
			is_easy_reading='沒有可讀性'
		fi
		echo "關於程式碼行美感與可讀性的統計如下..."
		echo '``````````````````````````````````````````'
		echo -e "程式碼的美感為:\t$is_beauty"
		echo -e "程式碼的可讀性為:\t$is_easy_reading"
		echo '``````````````````````````````````````````'
	}	

##呼叫主函式
	main