Bash 一个简单的计算平均值的小shell脚本

Bash 一个简单的计算平均值的小shell脚本,bash,shell,logic,syntax-error,Bash,Shell,Logic,Syntax Error,有人能告诉我我做错了什么吗 #!/bin/sh if [ $# = 0 ] then echo "Usage: $0 <filename>" exit 1 fi sum=0 count=0 while [ $0 != 0 ] do sum="$sum"+"$2" count="$count"+ 1 done if [ "$count" != 0 ] then avg="$sum"/"$count"

有人能告诉我我做错了什么吗

#!/bin/sh

if [ $# = 0 ]
then
    echo "Usage: $0 <filename>"
    exit 1
fi

sum=0
count=0

while [ $0 != 0 ]
do
        sum="$sum"+"$2"
        count="$count"+ 1

done
if [ "$count" != 0 ]
then
        avg="$sum"/"$count"
        printf "Sum= $sum \n Count= $count  \n Avg= $avg"
        exit 0
else
        printf "Sum= $sum \n Count= $count  \n Avg= undefined"
        exit 0
fi
exit 1
基本上,如果我有一个类似这样的文件:

FirstPerson 23 

SecondPerson 36

ThirdPerson 22
我希望能够将其读入我的程序并将其输出:

Sum = FirstPerson+SecondPerson+ThirdPerson

Count = NumberofPeople

Average = Sum/Count

首先,在=

的两边都不应该有空格。错误“Unterminated quoted string”是不言自明的

printf "Sum= \"$sum\" \n Count= \"$count\"  \n Avg= "\$avg\""
应该是

printf "Sum= \"$sum\" \n Count= \"$count\"  \n Avg= \"$avg\""

通过查看脚本,您似乎没有做多少正确的事情。 我建议看一些Bash如何操作,并按照简单的步骤让它实现您的期望

  • 变量赋值后没有空格,应该是
    sum=
    ,依此类推
  • while[!-f$1]
    实际上可能会做一些事情,但不是你所期望的
  • read-p“重新输入文件名并点击:”
    肯定没有达到预期效果
  • 等等
  • 首先,Bash不能进行整数除法,您要么需要将数学传递到像‘bc’这样的工具,要么就使用awk来完成这一切,因为它非常强大;毕竟,你的整个剧本都变成了一行

    样本输入 $cat ave.txt 第一人称23 第二人36 第三个人22 结果 总和=81 计数=3 平均值=27.00
    我不知道你的shell脚本,但我知道你应该使用正确的工具来完成这项工作。那个工具是AWK。它是专门为这项任务设计的,如果您使用的是UNIX(或Linux,或Mac OS X或其他什么),那么您就已经安装了它。这是一个班轮:

    awk '{ sum+=$2; count+=1 } END {print "Sum =",sum; print "Count =",count; print "Average= ",sum/count}' test2.dat 
    
    读这本书。UNIX的理念是不要重新发明轮子。使用正确的工具,伙计


    祝你好运,

    下面的代码可以运行,如果你愿意,你可以对它进行优化(或者使用awk、perl等):

    #/bin/bash
    如果[$#-ne 1];然后
    echo“用法:\“$0”
    出口
    fi
    如果[!-f$1];然后
    回显“$1文件未找到。”
    echo“用法:$0”
    出口
    fi
    总和=0
    计数=0
    arq=1美元
    读行时
    做
    num=`echo${line#*}`
    sum=`expr$sum+$num`
    count=`expr$count+1`
    完成<“$arq”
    如果[“$count”!=0]
    然后
    平均值=`expr$sum/$count`
    printf“Sum=\“$Sum\”\n Count=\“$Count\”\n Avg=\“$Avg”
    出口0
    其他的
    printf“Sum=\”$Sum\“\n Count=\”$Count\“\n Avg=未定义”
    出口0
    fi
    
    试试这个

    count_ppl=0
    sum=0
    while read a b
    do
       sum=$((sum+b))
       count_ppl=$((count_ppl+1))
    done < file
    echo "Sum=$sum"
    echo "Count=$count_ppl"
    avg=$(echo "scale=2;$sum/$count_ppl" | bc)
    echo "Average=" $avg
    
    count\u ppl=0
    总和=0
    读a b的时候
    做
    总和=$((总和+b))
    count_ppl=$((count_ppl+1))
    完成<文件
    echo“Sum=$Sum”
    echo“Count=$Count\u ppl”
    平均值=$(回声“刻度=2;$sum/$count_ppl”| bc)
    echo“Average=“$avg
    
    c程序,简单易懂
    #包括
    内部主(空)
    { 
    int p,r,t,s;
    printf(“输入原则值”);
    scanf(“%d”和“p”);
    printf(“输入利率或利息”);
    scanf(“%d”、&r);
    printf(“输入时间段”);
    scanf(“%d”、&t);
    s=p*t*r/100;
    printf(“单利为%d”,&s);
    }     
    
    Wow。我想你可以告诉我,我通常不写shell脚本…哈哈。谢谢,在我的示例中,我用您提供的数据编写了一个名为test2.dat的文件。哈哈,我做到了。除了awk已经为您提供了一个带有“NR”的计数之外,几乎完全相同。。。。写了一个更好的剧本。我将删除我的,不值得的AWK竞争者。虽然这是公认的答案,但它是不正确的,因为“expr”不进行浮点除法。只有当$count是$sum的整数倍时,此代码中计算的平均值才是正确的。尝试
    expr 5/2
    你会看到答案是2,而不是'2.5'siegex的正确值,我想你是在匆忙假设提问者想要一个浮点答案。。。可能是这样,也可能不是这样,因为他在问题中没有具体说明。我想告诉你,被截断为整数的平均数根本不是平均数,而是一个模。@Peter:算术平均数必须以实数进行,而不是整数(即,没有整数除法)。否则,正如SiegeX指出的,它不是算术平均值。您接受的答案不起作用,因为“expr”不进行浮点除法。运行expr 5/2,您将看到给出的答案不是“2.5”,而是“2”。如果你真的想坚持使用Bash(不是我的建议,请参阅stackoverflow.com/questions/1886157/…),那么你需要调用一个像“bc”这样的程序,它做浮点运算。然而,除非这是bash中的一个学习练习,否则我不明白你为什么不在awk中使用1行程序?如果你想要一个好的bash答案,那么我建议你接受这个答案:谢谢大家提供的有用信息。我没有意识到使用AWK来完成这项任务有多么容易。很好的bash解决方案,尽管它可以通过使用
    ((sum+=b))
    ((count_ppl++)
    而不是上面的两行代码来进行优化。优化了吗?我不明白。任何说+=或++的引用或证明最终会更快吗?如果这就是你的意思。在输入和代码可读性方面进行了优化。我认为这两种效率之间不会有太大的区别,那就没关系了。这都是个人喜好。只是一个QN,其他shell是否支持+=赋值运算符?这是一个C答案。完全独立于被询问的语言(bash) $ cat ave.txt FirstPerson 23 SecondPerson 36 ThirdPerson 22 Sum=81 Count=3 Ave=27.00
    awk '{ sum+=$2; count+=1 } END {print "Sum =",sum; print "Count =",count; print "Average= ",sum/count}' test2.dat 
    
    #!/bin/bash
    
    if [ $# -ne 1 ]; then
            echo "Usage: \"$0\" <filename>"
            exit
    fi
    
    if [ ! -f $1 ]; then
            echo "$1 file not found."
            echo "Usage: $0 <filename>"
            exit
    fi
    
    sum=0
    count=0
    arq=$1
    
    while read line
    do
            num=`echo ${line#* }`
            sum=`expr $sum + $num`
            count=`expr $count + 1`
    done < "$arq"
    
    if [ "$count" != 0 ]
    then
            avg=`expr $sum / $count`
            printf "Sum= \"$sum\" \n Count= \"$count\"  \n Avg= \"$avg\""
            exit 0
    else
            printf "Sum= \"$sum\" \n Count= \"$count\"  \n Avg= undefined"
            exit 0
    fi
    
    count_ppl=0
    sum=0
    while read a b
    do
       sum=$((sum+b))
       count_ppl=$((count_ppl+1))
    done < file
    echo "Sum=$sum"
    echo "Count=$count_ppl"
    avg=$(echo "scale=2;$sum/$count_ppl" | bc)
    echo "Average=" $avg
    
                c program for simple interest
    
     #include<stdio.h>
     int main(void)
      { 
        int p,r,t,s;
        printf("enter the principle value");
        scanf("%d",&p);
        printf("enter the rate or interest");
        scanf("%d",&r);
        printf("enter the time period ");
        scanf("%d",&t);
        s=p*t*r/100;
        printf("the simple interest is %d",&s);
      }