for循环中的shell脚本总和不起作用

时间:2013-05-13 07:02:17

标签: bash shell

size=`ls -l /var/temp.* | awk '{ print $5}'`
        fin_size=0
        for row in ${size} ;
        do      
                 fin_size=`echo $(( $row + $fin_size )) | bc`;
        done
echo $fin_size

不工作!! echo $fin_size正在抛出一些减去垃圾的垃圾。 在哪里我错了? (我的bash很旧,我想在这个只有Linux内核中工作:2.6.39)

3 个答案:

答案 0 :(得分:2)

Don't parse ls

为什么不使用du,如下所示?

du -cb /var/temp.* | tail -1 

答案 1 :(得分:1)

因为它不够强调:Why you shouldn't parse the output of ls(1)

使用例如按照dogbane的建议du,或find

$ find /var -maxdepth 1 -type f -name "temp.*" -printf "%s\n" | awk '{total+=$1}END{print total}'

stat

$ stat -c%s /var/temp.* | awk '{total+=$1}END{print total}'

globbingstat(不必要,慢):

total=0
for file in /var/temp.*; do
    [ -f "${file}" ] || continue
    size="$(stat -c%s "${file}")"
    ((total+=size))
done
echo "${total}"

答案 2 :(得分:-1)

下面应该足够了:

ls -l /var/temp.*  | awk '{a+=$5}END{print a}'

无需运行for循环。这意味着:

size=ls -l /var/temp.* | awk '{ print $5}'`
        fin_size=0
        for row in ${size} ;
        do      
                 fin_size=`echo $(( $row + $fin_size )) | bc`;
        done
echo $fin_size

以上所有内容都可以替换为:

fin_size=`ls -l /var/temp.*  | awk '{a+=$5}END{printf("%10d",a);}'`
echo $fin_size