问题描述
我被要求编写一个脚本(使用 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”文件中写入总数,我的脚本的参数是包含文件的目录的路径。
如果有人有另一种技术来计算这个,我将不胜感激。 谢谢!
解决方法
版本 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 中错过 $
符号是很常见的!尽量不要忘记它们:)
您也可以使用循环来聚合计数:
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}"
,
这是我使用的脚本(稍作修改):
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$total\ttotal"
,
这是我的版本。
#!/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\0' "${files[@]}")
echo "$sum" > manifest.txt
需要一些错误检查,比如参数是否是一个目录,或者它是否存在,等等。