如何处理Bash脚本中的空用户输入?

时间:2013-06-15 11:43:34

标签: string bash

当脚本要求我输入时,如果我只是按回车而没有输入任何内容,则会出现错误。我该如何解决这个问题?

这是脚本:

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

3 个答案:

答案 0 :(得分: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解释基数10中的输入。这就是为什么我使用(10#$score)而不仅仅是score
  • read-p(提示)选项一起使用,而不是使用笨拙的组合echo -n / read

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

    如果用户需要大数字,
  • 将会中断
  • 使用shell算术时,只能使用整数。此外,此计划给出的平均值是四舍五入的:如果您想要12的平均值,您将拥有1

要解决这两个问题,您可能希望使用bcdc。但那将是另一个问题的目的。或者不是。

答案 1 :(得分:1)

预先初始化$SCORE或处理空输入,就像在q案例中一样。

答案 2 :(得分:1)

[[ -z "$SCORE" ]] && echo "\$SCORE is zero, e.g. \"\"" 

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

您还应该在开头设置AVERAGE=0