-2

当脚本要求我输入时,如果我只按 Return 而不输入任何内容,我会收到错误消息。我该如何解决?

这是脚本:

 #!/bin/bash

   SUM=0
   NUM=0

   while true
   do echo -n "Pruefungspunkte eingeben ('q' zum Beenden): "
      read SCORE
      if test "$SCORE" == "q"
      then echo "Durchschnittspunktzahl: $AVERAGE."
           break
      else SUM=`expr $SUM + $SCORE`
           NUM=`expr $NUM + 1`
           AVERAGE=`expr $SUM / $NUM`
      fi
   done
4

3 回答 3

2

如何使用良好的 bash 实践?

#!/bin/bash

sum=0
num=0

while true; do
   read -erp "Pruefungspunkte eingeben ('q' zum Beenden): " score
   if [[ $score = q ]]; then
      echo "Durchschnittspunktzahl: $average."
      break
   elif [[ $score =~ ^-?[[:digit:]]+$ ]]; then
      ((sum+=10#$score))
      ((++num))
      ((average=sum/num))
   else
      echo "Bad number"
   fi
done

好习惯:

  • 不要使用大写的变量名
  • 使用[[内置而不是test内置
  • 不要使用反引号,用于((调用 shell 算术
  • 为确保用户输入了数字,请检查是否确实输入了数字。线

    elif [[ $score =~ ^-?[[:digit:]]+$ ]]; then
    

    只是这样做(见正则表达式)。顺便说一句,它完全解决了你原来的问题,因为空输入不会通过这个测试

  • 为了防止用户输入09而不是 时出现问题9,请强制 bash 以 radix 解释输入10。这就是为什么我使用(10#$score)而不是仅仅使用score.
  • read与(提示)选项一起使用-p,而不是笨拙的组合echo -n/read

这个版本比你的版本更健壮,写得更好。然而,它仍然存在问题:

  • 如果用户需要大量数据,将会中断
  • 由于使用了 shell 算术,因此只能使用整数。此外,这个程序给出的平均值是四舍五入的:如果你想要 的平均值,12会得到1.

要解决这两个问题,您可能需要使用bcor dc。但这将是另一个问题的目的。或不。

于 2013-06-15T12:15:06.767 回答
1

$SCORE事先初始化或处理空输入,q以防万一。

于 2013-06-15T11:46:41.393 回答
1
[[ -z "$SCORE" ]] && echo "\$SCORE is zero, e.g. \"\"" 

这将测试变量 SCORE 是否为空字符串。

你也应该AVERAGE=0在开头设置。

于 2013-06-15T11:50:11.573 回答