当脚本要求我输入时,如果我只是按回车而没有输入任何内容,则会出现错误。我该如何解决这个问题?
这是脚本:
#!/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
答案 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
这个版本比你的版本更强大,写得更好。然而,它仍然存在问题:
1
和2
的平均值,您将拥有1
。要解决这两个问题,您可能希望使用bc
或dc
。但那将是另一个问题的目的。或者不是。
答案 1 :(得分:1)
预先初始化$SCORE
或处理空输入,就像在q
案例中一样。
答案 2 :(得分:1)
[[ -z "$SCORE" ]] && echo "\$SCORE is zero, e.g. \"\""
这将测试变量SCORE是否为空字符串。
您还应该在开头设置AVERAGE=0
。