我正在编写一个 shell 脚本来计算文件中数字的平均值,但由于某种原因 bash 没有将我的数字加在一起。
我尝试了多种格式化 sum='expr $sum + $num' 的方法,但不断出现错误。
while read line
do
sum=0
count=0
average=0
median=0
#read each line, sort it and put it into tempRows file
echo "$line" >> $tempRow
sort $tempRow
#add each number to the sum for avg calculation
for i in $tempRow
do
num=$i
count=`expr $count + 1`
echo "count: $count"
sum=`expr $sum + $num`
echo "sum: $sum"
done
#perform and print average calc at the end of each line
average=`expr $sum / $count`
echo -e "$average\t"
rm -f $tempRow
done < $tempFile
目前这段代码在退出之前给了我以下输出
count: 1
expr:non-numeric argument
sum:
expr:syntax error
我在添加到 tempRow 以便以后进行中值计算之前对每一行进行排序示例文件将包含多个行和列的整数,我将打印出每行的平均值和中值
答案1
跑步bash -x myscript
。这将为您提供执行的踪迹,从而使问题变得清晰。
你的主要问题是
for i in $tempRow
该变量$tempRow
包含一个文件名。假设文件名不包含任何空格或通配符,则$tempRow
扩展为包含一个单词的列表,即该文件名。因此 for 循环体运行一次,并i
设置为文件名。
看来您想要迭代文件的行。用于while read
此。更确切地说,while IFS= read -r i; do …
。
一些额外的提示:
- 始终将变量扩展放在双引号中,除非您知道为什么不这样做。
- 不要使用
expr
.这是 21 世纪,所有的 shell 都内置了算术。count=$((count + 1))
ETC。 - 您在每次运行外循环时进行排序的逻辑很奇怪,但我没有试图弄清楚您要计算的内容。