对Shell脚本进行行统计

前端之家收集整理的这篇文章主要介绍了对Shell脚本进行行统计前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

使用方法

脚本指定了惟一一个参数,该参数可以是某个文件的路径或者某个文件夹的路径

  1. ./codenum.sh file/dir

思路

输入指定路径,遍历路径下的文件文件夹,对文件直接统计行数,对文件夹进行遍历文件,然后再统计

源码

  1. #!/bin/bash
  2. # 代码统计工具
  3. # 使用: script file/dir
  4. # author luodongseu
  5.  
  6. echo "------------------------Welcome!----------------------"
  7.  
  8. #传入的参数
  9. #文件路径
  10. FILE_PATH=$1
  11.  
  12. #全局变量
  13. #统计对象类型: 1为文件;2为目录
  14. typeset FILE_TYPE=1
  15. #存储行数
  16. typeset TOTAL_LINES=0
  17. #存储文件数量
  18. typeset TOTAL_FILE_NUM=0
  19. #空行数量
  20. typeset TOTAL_BLANK_LINES=0
  21. #注释行数量
  22. typeset TOTAL_COMMENT_LINES=0
  23. #有效代码行数
  24. typeset TOTAL_CODE_LINES=0
  25.  
  26. #日志文件
  27. LOG_FILE=$(cd $(dirname $0);pwd)/calnum.out
  28. echo "" > ${LOG_FILE}
  29.  
  30. ########################################################
  31. # 打印日志函数
  32. ########################################################
  33. function log
  34. {
  35. echo "[`date +"%Y-%m-%d %H:%M:%S"`]" "[$1]" $2
  36. echo "[`date +"%Y-%m-%d %H:%M:%S"`]" "[$1]" $2 >> ${LOG_FILE}
  37. }
  38.  
  39. ########################################################
  40. # 判断统计对象时文件还是目录
  41. ########################################################
  42. function check_is_dir
  43. {
  44. if [ -f ${FILE_PATH} ];then
  45. # 是一个文件
  46. FILE_TYPE=1
  47. elif [ -d ${FILE_PATH} ];then
  48. # 是一个目录
  49. FILE_TYPE=2
  50. else
  51. # 不存在文件或目录
  52. log "EORROR" "File or dir is not exist!"
  53. exit 1
  54. fi
  55. }
  56.  
  57. ########################################################
  58. # 统计总行号
  59. ########################################################
  60. function cal_total_num
  61. {
  62. typeset TMP_TYPE=$1
  63. typeset TMP_PATH=$2
  64. typeset CUR_DIR="./"
  65. if [ ${TMP_TYPE} -eq 1 ];then
  66. # 单个文件统计
  67. ## 统计文件数量
  68. TOTAL_FILE_NUM=$(expr ${TOTAL_FILE_NUM} + 1)
  69. ## 统计行数
  70. typeset current_file_lines=$(cat ${TMP_PATH} | grep "" | wc -l)
  71. TOTAL_LINES=$(expr ${TOTAL_LINES} + ${current_file_lines})
  72. log "DEBUG" "File ${TMP_PATH} LINES is ${current_file_lines}."
  73. #log "DEBUG" "Current TOTAL_LINES is ${TOTAL_LINES}."
  74. ## 统计空白行
  75. typeset current_blank_lines=$(cat ${TMP_PATH} | grep -rn "^\s*$" | wc -l)
  76. TOTAL_BLANK_LINES=$(expr ${TOTAL_BLANK_LINES} + ${current_blank_lines})
  77. log "DEBUG" "File ${TMP_PATH} BLANK_LINES is ${current_blank_lines}."
  78. #log "DEBUG" "Current TOTAL_BLANK_LINES is ${TOTAL_BLANK_LINES}."
  79. ## 统计注释行
  80. typeset current_comment_lines=$(cat ${TMP_PATH} | grep -rn "^\s*#.*$" | wc -l)
  81. TOTAL_COMMENT_LINES=$(expr ${TOTAL_COMMENT_LINES} + ${current_comment_lines})
  82. log "DEBUG" "File ${TMP_PATH} COMMENT_LINES is ${current_comment_lines}."
  83. #log "DEBUG" "Current TOTAL_COMMENT_LINES is ${TOTAL_COMMENT_LINES}."
  84. ## 统计有效代码
  85. typeset current_code_lines=$(expr ${current_file_lines} - ${current_blank_lines} - ${current_comment_lines})
  86. TOTAL_CODE_LINES=$(expr ${TOTAL_CODE_LINES} + ${current_code_lines})
  87. log "DEBUG" "File ${TMP_PATH} CODE_LINES is ${current_code_lines}."
  88. #log "DEBUG" "Current TOTAL_CODE_LINES is ${TOTAL_CODE_LINES}."
  89. else
  90. # 目录递归遍历
  91. for line in $(ls ${TMP_PATH})
  92. do
  93. if [ -f ${TMP_PATH}/$line ];then
  94. # 文件
  95. cal_total_num 1 ${TMP_PATH}/$line
  96. else
  97. # 目录
  98. cal_total_num 2 ${TMP_PATH}/$line
  99. fi
  100. done
  101. fi
  102. }
  103.  
  104. ########################################################
  105. # 输出最终的行数结果
  106. ########################################################
  107. function output_lines
  108. {
  109. printf "%-20s%-30s%-20s%-40s\n" "Step" "Name" "Value" "Comments"
  110. printf "%-20s%-30s%-20s%-40s\n" "RESULT" "TOTAL_FILE_NUM" ${TOTAL_FILE_NUM} "#文件总数"
  111. printf "%-20s%-30s%-20s%-40s\n" "RESULT" "TOTAL_LINES" ${TOTAL_LINES} "#所有行和"
  112. printf "%-20s%-30s%-20s%-40s\n" "RESULT" "TOTAL_BLANK_LINES" ${TOTAL_BLANK_LINES} "#空白行和"
  113. printf "%-20s%-30s%-20s%-40s\n" "RESULT" "TOTAL_COMMENT_LINES" ${TOTAL_COMMENT_LINES} "#注释行和"
  114. printf "%-20s%-30s%-20s%-40s\n" "RESULT" "TOTAL_CODE_LINES" ${TOTAL_CODE_LINES} "#代码行和"
  115. # 输出到日志文件
  116. printf "%-20s%-30s%-20s%-40s\n" "Step" "Name" "Value" "Comments" >> ${LOG_FILE}
  117. printf "%-20s%-30s%-20s%-40s\n" "RESULT" "TOTAL_FILE_NUM" ${TOTAL_FILE_NUM} "#文件总数" >> ${LOG_FILE}
  118. printf "%-20s%-30s%-20s%-40s\n" "RESULT" "TOTAL_LINES" ${TOTAL_LINES} "#所有行和" >> ${LOG_FILE}
  119. printf "%-20s%-30s%-20s%-40s\n" "RESULT" "TOTAL_BLANK_LINES" ${TOTAL_BLANK_LINES} "#空白行和" >> ${LOG_FILE}
  120. printf "%-20s%-30s%-20s%-40s\n" "RESULT" "TOTAL_COMMENT_LINES" ${TOTAL_COMMENT_LINES} "#注释行和" >> ${LOG_FILE}
  121. printf "%-20s%-30s%-20s%-40s\n" "RESULT" "TOTAL_CODE_LINES" ${TOTAL_CODE_LINES} "#代码行和" >> ${LOG_FILE}
  122. }
  123.  
  124. check_is_dir
  125. cal_total_num ${FILE_TYPE} ${FILE_PATH}
  126. output_lines
  127.  
  128. echo "------------------------End----------------------"

猜你在找的Bash相关文章