用shell實現一個小指令碼,用來同來統計自己某個檔案下的程式碼,總的程式碼行數,總的註釋量,總的空行量?支援遍歷查詢,支援軟連結查詢
阿新 • • 發佈:2018-12-09
[[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