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

에이바*_*에이바 4 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"
        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
Run Code Online (Sandbox Code Playgroud)

这是我尝试测试代码时的输出:

./average

sum: =: No such file or directory
sum: 0: No such file or directory
./average: 11: count: not found
[: 18: !=0: unexpected operator
./average: 25: Syntax error: Unterminated quoted string
Run Code Online (Sandbox Code Playgroud)

基本上,如果我有一个看起来像这样的文件:

FirstPerson 23 

SecondPerson 36

ThirdPerson 22
Run Code Online (Sandbox Code Playgroud)

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

Sum = FirstPerson+SecondPerson+ThirdPerson

Count = NumberofPeople

Average = Sum/Count
Run Code Online (Sandbox Code Playgroud)

Sie*_*geX 16

 awk '{sum+=$2}END{printf "Sum=%d\nCount=%d\nAve=%.2f\n",sum,NR,sum/NR}' ave.txt
Run Code Online (Sandbox Code Playgroud)

首先,Bash不能进行整数除法,你需要将数学管道传递给像'bc'这样的工具,或者只是使用awk来完成所有这一切,因为它非常强大; 毕竟,你的整个剧本都变成了一个单行.

样本输入

$ cat ave.txt
FirstPerson 23
SecondPerson 36
ThirdPerson 22

结果

Sum=81
Count=3
Ave=27.00


Esc*_*alo 6

我不知道你的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 
Run Code Online (Sandbox Code Playgroud)

阅读AWK指南.UNIX的理念是不要重新使用轮子.使用合适的工具,好友.

祝好运,