使用方法
脚本指定了惟一一个参数,该参数可以是某个文件的路径或者某个文件夹的路径
./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----------------------"
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。