【问题标题】:Adding / averaging several variables in Bash在 Bash 中添加/平均几个变量
【发布时间】:2018-07-11 07:14:46
【问题描述】:

我有这个问题,我在晚上的大部分时间里一直在努力解决这个问题。我需要得到这个脚本来添加变量,然后将它们平均出来,并在计算后显示学生姓名、总分和平均值。

这是我所拥有的:

#!/bin/bash

echo "================"
echo "Grade Calculator"
echo "================"

read -p "Enter first name: " $FirstName
read -p "Enter last name: " $LastName

read -p "Enter test score 1: " $ScoreOne
read -p "Enter test score 2: " $ScoreTwo
read -p "Enter test score 3: " $ScoreThree
read -p "Enter test score 4: " $ScoreFour
read -p "Enter lab score: " $Lab
Total=expr `$ScoreOne + $ScoreTwo + $ScoreThree + $ScoreFour + $Lab`

echo "Grade results. . ."
echo "Student name: $FirstName $LastName"
echo "Total points: $Total" 

任何指针将不胜感激。

【问题讨论】:

  • 同意以下,但你也可以这样做 Total=`expr ....` 。祝你好运。
  • @shelter,当然先生,现在也在代码中添加了expr
  • 使用stackoverflow.com/questions/19149731/… 并在标准输入上传递分数。可能也可以使用 awk 很好地打印结果。

标签: linux bash shell variables scripting


【解决方案1】:

正在编辑您的脚本本身,请您尝试关注并告诉我是否有帮助。

#!/bin/bash

echo "================"
echo "Grade Calculator"
echo "================"

read -p "Enter first name: " FirstName
read -p "Enter last name: " LastName

read -p "Enter test score 1: " ScoreOne
read -p "Enter test score 2: " ScoreTwo
read -p "Enter test score 3: " ScoreThree
read -p "Enter test score 4: " ScoreFour
read -p "Enter lab score: " Lab
Total=$((ScoreOn + ScoreTwo + ScoreThree + ScoreFour + Lab))

echo "Grade results. . ."
echo "Student name: $FirstName $LastName"
echo "Total points: $Total"

编辑:如果你想使用expr,你可以改变上面代码的total变量行,然后:

Total=$(expr "$ScoreOne" + "$ScoreTwo" + "$ScoreThree" + "$ScoreFour")

【讨论】:

  • 如果你有一个现代外壳,你真的不想想使用expr
  • @tripleee,当然,因为 OP 使用的是expr,所以我现在也添加了该解决方案,感谢您的意见先生。
【解决方案2】:

您消失的变量值可以通过以下方式解释:

read -p "Enter first name: " $FirstName
read -p "Enter last name: " $LastName

注意:变量名前'$'不正确,赋值时不要包含'$'

虽然您可以将输入输入到固定变量名称中,但这样做会将自己限制在功能有限的脚本中,该脚本不能多(或不少)您为其指定变量名称的值的数量。解决同一问题的另一种方法是简单地读取循环中的值,当用户在空白行(不输入分数)按 Enter 时,该循环将终止。

由于您的问题被标记为 bash,您可以简单地测试输入是否为整数等级,然后将值添加到数组中。输入完成后,您可以计算有关您喜欢的成绩的任何统计数据。 (可以在输入时或输入完成后求和)

Bash 不提供任何类型的浮点数处理,因此对于您的平均而言,您可以寻求bc(或calc)的帮助,它可以为您计算浮点值。

将各个部分放在一起,您可以执行以下操作。 (有很多方法可以解决这个问题)

#!/bin/bash

declare -a grades
declare -i total=0

echo "================"
echo "Grade Calculator"
echo "================"

read -p "Enter first name: " FirstName
read -p "Enter last name: " LastName

score=" "
## loop collecting grades until user presses return on empty line
printf "(Press return on empty line to end input)\n-----------------\n"
while [ -n "$score" ]; do
    read -p "Enter test score: " score
    ## validate integer and add to array
    [ "$score" -eq "$score" >/dev/null 2>&1 ] && grades+=( $score )
done

echo "Grade results. . ."
echo "Student name: $FirstName $LastName"
printf "\ngrades:\n"
for i in "${grades[@]}"; do
    printf "  %3d\n" "$i"
    total=$((total + i))
done
printf -- " -----\n  %3d  total\n\n" "$total"

## compute average with bc
printf "Average: %s\n" $(printf "scale=2; %d / %d\n" $total ${#grades[@]} | bc)

使用/输出示例

$ bash tmp/grades.sh
================
Grade Calculator
================
Enter first name: John
Enter last name: Doe
(Press return on empty line to end input)
-----------------
Enter test score: 88
Enter test score: 94
Enter test score: 92
Enter test score: 80
Enter test score: 87
Enter test score:
Grade results. . .
Student name: John Doe

grades:
   88
   94
   92
   80
   87
 -----
  441  total

Average: 88.20

通过检查用户输入的整数作为输入,如果出现错误,您的输入不会受到影响,例如

Enter test score: 88
Enter test score: uugh, messed up
Enter test score: 92

(简单地忽略非整数输入)

【讨论】:

  • 谢谢你们!我知道这是一个简单的问题,我不知道我到底在做什么......但我正在学习!
  • @Hebruiser 你会到达那里的。 Bash 是一个很棒的 shell。很少有你不能做的。添加书签以帮助您学习:Bash GuideBash FAQBash Pitfalls
猜你喜欢
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
相关资源
最近更新 更多