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“重新输入文件名并点击:”
肯定没有达到预期效果我不知道你的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);
}