對Shell腳本進行行統計

使用方法

腳本指定了唯一一個參數,該參數能夠是某個文件的路徑或者某個文件夾的路徑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----------------------"
相關文章
相關標籤/搜索