4

谁能告诉我我在这里做错了什么?

#!/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

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

./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

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

FirstPerson 23 

SecondPerson 36

ThirdPerson 22

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

Sum = FirstPerson+SecondPerson+ThirdPerson

Count = NumberofPeople

Average = Sum/Count
4

8 回答 8

17
 awk '{sum+=$2}END{printf "Sum=%d\nCount=%d\nAve=%.2f\n",sum,NR,sum/NR}' ave.txt

首先,Bash 不能进行整数除法,您要么需要将数学运算传递给像 'bc' 这样的工具,要么只使用 awk 来完成这一切,因为它非常强大;毕竟,你的整个剧本都变成了 1-liner。

样本输入

$ cat ave.txt
第一人称 23
第二人称 36
第三人称 22

结果

总和=81
计数=3
平均=27.00
于 2009-12-11T06:41:28.507 回答
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 

阅读AWK 指南。UNIX 的理念是不要重新发明轮子。使用正确的工具,伙计。

祝你好运,

于 2009-12-11T06:42:52.120 回答
2

下面的代码有效,您可以根据需要对其进行优化(或使用 awk、perl 等):

#!/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
于 2009-12-11T06:52:08.893 回答
2

试试这个

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
于 2009-12-11T07:04:24.680 回答
1

首先,您不应该在 = 的任何一侧都有空格

于 2009-12-11T06:22:28.007 回答
1

错误“未终止的引用字符串”是不言自明的

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

应该

printf "Sum= \"$sum\" \n Count= \"$count\"  \n Avg= \"$avg\""
于 2009-12-11T06:26:29.153 回答
1

通过查看脚本,您似乎没有做太多正确的事情。我建议查看一些 Bash 操作方法并按照简单的步骤使其达到您的预期。

  1. 变量赋值后没有空格,应该是sum=等等
  2. while [ ! -f $1 ]实际上可能会做一些事情,但不是你所期望的
  3. read -p "Re-enter the filename and hit <Enter>: "绝对不会做你所期望的
  4. 等等
于 2009-12-11T06:34:56.533 回答
1
            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);
  }     
于 2012-05-29T10:16:09.143 回答