腳本指定了唯一一個參數,該參數能夠是某個文件的路徑或者某個文件夾的路徑bash
./codenum.sh file/dir
輸入指定路徑,遍歷路徑下的文件或文件夾,對文件直接統計行數,對文件夾進行遍歷文件,而後再統計函數
#!/bin/bash # 代碼統計工具 # 使用: script file/dir # author luodongseu echo "------------------------Welcome!----------------------" #傳入的參數 #文件路徑 FILE_PATH=$1 #全局變量 #統計對象類型: 1爲文件;2爲目錄 typeset FILE_TYPE=1 #存儲行數 typeset TOTAL_LINES=0 #存儲文件數量 typeset TOTAL_FILE_NUM=0 #空行數量 typeset TOTAL_BLANK_LINES=0 #註釋行數量 typeset TOTAL_COMMENT_LINES=0 #有效代碼行數 typeset TOTAL_CODE_LINES=0 #日誌文件 LOG_FILE=$(cd $(dirname $0);pwd)/calnum.out echo "" > ${LOG_FILE} ######################################################## # 打印日誌函數 ######################################################## function log { echo "[`date +"%Y-%m-%d %H:%M:%S"`]" "[$1]" $2 echo "[`date +"%Y-%m-%d %H:%M:%S"`]" "[$1]" $2 >> ${LOG_FILE} } ######################################################## # 判斷統計對象時文件仍是目錄 ######################################################## function check_is_dir { if [ -f ${FILE_PATH} ];then # 是一個文件 FILE_TYPE=1 elif [ -d ${FILE_PATH} ];then # 是一個目錄 FILE_TYPE=2 else # 不存在文件或目錄 log "EORROR" "File or dir is not exist!" exit 1 fi } ######################################################## # 統計總行號 ######################################################## function cal_total_num { typeset TMP_TYPE=$1 typeset TMP_PATH=$2 typeset CUR_DIR="./" if [ ${TMP_TYPE} -eq 1 ];then # 單個文件統計 ## 統計文件數量 TOTAL_FILE_NUM=$(expr ${TOTAL_FILE_NUM} + 1) ## 統計行數 typeset current_file_lines=$(cat ${TMP_PATH} | grep "" | wc -l) TOTAL_LINES=$(expr ${TOTAL_LINES} + ${current_file_lines}) log "DEBUG" "File ${TMP_PATH} LINES is ${current_file_lines}." #log "DEBUG" "Current TOTAL_LINES is ${TOTAL_LINES}." ## 統計空白行 typeset current_blank_lines=$(cat ${TMP_PATH} | grep -rn "^\s*$" | wc -l) TOTAL_BLANK_LINES=$(expr ${TOTAL_BLANK_LINES} + ${current_blank_lines}) log "DEBUG" "File ${TMP_PATH} BLANK_LINES is ${current_blank_lines}." #log "DEBUG" "Current TOTAL_BLANK_LINES is ${TOTAL_BLANK_LINES}." ## 統計註釋行 typeset current_comment_lines=$(cat ${TMP_PATH} | grep -rn "^\s*#.*$" | wc -l) TOTAL_COMMENT_LINES=$(expr ${TOTAL_COMMENT_LINES} + ${current_comment_lines}) log "DEBUG" "File ${TMP_PATH} COMMENT_LINES is ${current_comment_lines}." #log "DEBUG" "Current TOTAL_COMMENT_LINES is ${TOTAL_COMMENT_LINES}." ## 統計有效代碼行 typeset current_code_lines=$(expr ${current_file_lines} - ${current_blank_lines} - ${current_comment_lines}) TOTAL_CODE_LINES=$(expr ${TOTAL_CODE_LINES} + ${current_code_lines}) log "DEBUG" "File ${TMP_PATH} CODE_LINES is ${current_code_lines}." #log "DEBUG" "Current TOTAL_CODE_LINES is ${TOTAL_CODE_LINES}." else # 目錄遞歸遍歷 for line in $(ls ${TMP_PATH}) do if [ -f ${TMP_PATH}/$line ];then # 文件 cal_total_num 1 ${TMP_PATH}/$line else # 目錄 cal_total_num 2 ${TMP_PATH}/$line fi done fi } ######################################################## # 輸出最終的行數結果 ######################################################## function output_lines { printf "%-20s%-30s%-20s%-40s\n" "Step" "Name" "Value" "Comments" printf "%-20s%-30s%-20s%-40s\n" "RESULT" "TOTAL_FILE_NUM" ${TOTAL_FILE_NUM} "#文件總數" printf "%-20s%-30s%-20s%-40s\n" "RESULT" "TOTAL_LINES" ${TOTAL_LINES} "#全部行和" printf "%-20s%-30s%-20s%-40s\n" "RESULT" "TOTAL_BLANK_LINES" ${TOTAL_BLANK_LINES} "#空白行和" printf "%-20s%-30s%-20s%-40s\n" "RESULT" "TOTAL_COMMENT_LINES" ${TOTAL_COMMENT_LINES} "#註釋行和" printf "%-20s%-30s%-20s%-40s\n" "RESULT" "TOTAL_CODE_LINES" ${TOTAL_CODE_LINES} "#代碼行和" # 輸出到日誌文件 printf "%-20s%-30s%-20s%-40s\n" "Step" "Name" "Value" "Comments" >> ${LOG_FILE} printf "%-20s%-30s%-20s%-40s\n" "RESULT" "TOTAL_FILE_NUM" ${TOTAL_FILE_NUM} "#文件總數" >> ${LOG_FILE} printf "%-20s%-30s%-20s%-40s\n" "RESULT" "TOTAL_LINES" ${TOTAL_LINES} "#全部行和" >> ${LOG_FILE} printf "%-20s%-30s%-20s%-40s\n" "RESULT" "TOTAL_BLANK_LINES" ${TOTAL_BLANK_LINES} "#空白行和" >> ${LOG_FILE} printf "%-20s%-30s%-20s%-40s\n" "RESULT" "TOTAL_COMMENT_LINES" ${TOTAL_COMMENT_LINES} "#註釋行和" >> ${LOG_FILE} printf "%-20s%-30s%-20s%-40s\n" "RESULT" "TOTAL_CODE_LINES" ${TOTAL_CODE_LINES} "#代碼行和" >> ${LOG_FILE} } check_is_dir cal_total_num ${FILE_TYPE} ${FILE_PATH} output_lines echo "------------------------End----------------------"