我被要求编写一个脚本(使用bash),计算在单个目录中重新组合的文件(但只有C文件(.h和.C)和python文件(.py))中的行数。我已经尝试过这个代码,但我的计算总是错误的
let "sum = 0"
let "sum = sum + $(wc -l $1/*.c | tail --lines=1 | tr -dc '0-9')"
let "sum = sum + $(wc -l $1/*.h | tail --lines=1 | tr -dc '0-9')"
let "sum = sum + $(wc -l $1/*.py | tail --lines=1 | tr -dc '0-9')"
echo $sum >> manifest.txt
我必须把总数写在";manifest.txt";文件,而我的脚本的参数是包含这些文件的目录的路径。
如果有人有另一种计算方法,我将不胜感激。非常感谢。
您也可以使用循环来聚合计数:
extensions=("*.h" "*.c" "*.py")
sum=0
for ext in ${extensions[@]} ; do
count=$(wc -l ${1}/${ext} | awk '{ print $1 }')
sum=$((sum+count))
done
echo "${sum}"
版本1:逐步
#!/bin/bash
echo "Counting the total number of lines for all .c .h .py files in $1"
sum=0
num_py=$(wc -l $1/*.py | tail -1 | tr -dc '0-9')
num_c=$(wc -l $1/*.c | tail -1 | tr -dc '0-9')
num_h=$(wc -l $1/*.h | tail -1 | tr -dc '0-9')
sum=$(($num_py + $num_c + $num_h))
echo $sum >> manifest.txt
版本2:简明
#!/bin/bash
echo "Counting the total number of lines for all .c .h .py files in $1"
echo "$(( $(wc -l $1/*.py | tail -1 | tr -dc '0-9') + $(wc -l $1/*.c | tail -1 | tr -dc '0-9') + $(wc -l $1/*.h | tail -1 | tr -dc '0-9') ))" >> manifest.txt
版本3:在你想要的文件上循环
#!/bin/bash
echo "Counting the total number of lines for all .c .h .py files in $1"
sum=0
for sfile in $1/*.{c,h,py}; do
sum=$(($sum+$(wc -l $sfile|tail -1|tr -dc '0-9')))
done
echo $sum >> manifest.txt
这就是算术运算的工作方式:var = $((EXPR))
例如:$sum= $(($sum + $result ))
在EXPR中错过CCD_ 3符号是非常常见的!尽量不要忘记它们:)
这是我使用的脚本(稍作修改):
files=( $(find . -mindepth 1 -maxdepth 1 -type f -iname "*.h" -iname "*.c" -iname "*.py") )
declare -i total=0
for file in "${files[@]}"; do
lines="$(wc -l < <(cat "$file"))"
echo -e "${lines}t${file}"
total+="$lines"
done
echo -e "n$totalttotal"
这是我的版本。
#!/usr/bin/env bash
shopt -s extglob nullglob
files=( "$1"/*.@(c|h|py) )
shopt -u extglob nullglob
while IFS= read -rd '' file_name; do
count=$(wc -l < "$file_name")
((sum+=count))
done< <(printf '%s ' "${files[@]}")
echo "$sum" > manifest.txt
需要一些错误检查,比如参数是否是目录,或者它是否存在,等等