歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

Linux下統計某個目錄下所有源代碼行數的Shell腳本

由於要統計某個源代碼下的所有代碼的行數,所以這裡自己寫了個腳本來完成這個功能。我在編寫這個腳本的時候,遇到了一些問題,我先把代碼貼在這裡;

使用方法,將此腳本文件存為linesNumber.sh,使用時,在後面跟上指定目錄即可,例如:

# ./linesNumber.sh mplayer
就是統計mplayer目錄下的所有.cpp,.c,.h文件的源代碼行數;
對於你還需要增加其他的行數,你只需更改教本中的REG變量即可,更改方法參考REG變量內容,對應修改即可;

/**************************************************/
#! /bin/sh
# writed by lsosa for counting the number of all the source code;
# example ./linesNumber.sh . 
# usage info;
USAGE="Usage:\t./linesNumber.sh .\n"
# help info;
HELP="You can count the number of lines of the specified directory by this script\n${USAGE}"
# the tmp file to save the number of lines;
COUNT_TMP_FILE=/tmp/count
# this filter can get all the *.cpp *.c *.h files from your source code tree;
REG=’\.cpp$|\.c$|\.h$’
# show usage when you use this script with some incorrect way;
show_usage(){
    echo -ne ${HELP}
}
# function to count lines of all your source code tree;
count_lines(){
    # excluding the error;
    if [ $# -lt 1 ]
    then
        echo "Usage: count_lines $1"
        return 1
    fi
    # start to count the number of lines;
    _DIR=$1
    echo "Start to count the number of lines in current directory ${_DIR}"
    find ${_DIR} -name "*" | grep -E ${REG} | \
    while read LINE
    do
        NUMLINES=`cat ${LINE} | wc -l`
        echo ${LINE}:${NUMLINES}
        NUM=`expr ${NUM} + ${NUMLINES}`
        echo ${NUM} > ${COUNT_TMP_FILE}
    done
    echo "The number of all the lines are:" 
    cat ${COUNT_TMP_FILE}
    rm -f ${COUNT_TMP_FILE}
    echo "Counting Finished"
}
# main;
main(){
    if [ ! $# = 1 ]
    then
        # show help about this script;
        show_usage
        exit 1
    else
        # start to count lines;
        count_lines $1
    fi
}
# call main;
main $1
/**************************************************/

主要是兩個問題:
一、
while循環內部變量NUM存儲的是每一次累加的文件行數值,但是這個值不能夠在while循環外使用,這會給編寫腳本的人造成極大的不便,這個問題,我是繞過解決的,並沒有找到更合適的類似C或者C++對其直接支持的方法;我是將每次的累加值存儲到那個臨時文件(/tmp/count)中,最後顯示這個文件中的值就是總行數,這樣就讓過了while循環內部變量不能在循環外使用的局限;不知道各位有什麼好的方法沒有;
二、
函數內部並不能夠直接使用shell傳給腳本的參數,你可以檢測一下,對於$1,$#都是空或0。這裡的解決方法比較簡單了,就是將shell的參數傳給函數即可,shell中函數調用參數很簡單,將參數羅列排在函數名後面即可;函數要使用參數也只需要使用$1-$9調用即可,這種使用方法同shell主腳本的;
最後,還有個疑問吧,就是shell使用變量似乎不用定義,直接使用即可,初始化都是個空串,隨你後面怎麼使用而變化,你當數字使用,它就存數字,當字符串使用,它就存字符串;這一點很方便,但也容易造成混淆,這就看咱們的使用習慣了。

Copyright © Linux教程網 All Rights Reserved