使用if-else语句的数学方程式

时间:2017-05-10 16:04:56

标签: bash shell if-statement math var

我在使用测试脚本实现特定结果时遇到了一些错误。

我想从存储在文件夹中的文档中计算单词列表然后

变量"wword"是CORRECT的单词数量。共有17个单词。这个数字(15)当然会根据用户输入进行更改,因此变量"wword"

的推理

我目前遇到的问题是"一元运营商预期"并且这行代码gradel=$('"$wword"' - 17)没有插入$wword变量,因为它应该是15.我做错了什么?

wword="15"

gradel=$('"$wword"' - 17)
gradel=$('"$gradel"' / 17)



if [ "$gradel" => "1" ] 
then 
  gradel="A+" 

elif [ "$gradel" => ".90" ] 
then
  gradel="A"

elif [ "$gradel" => ".85" ] 
then
  gradel=“B+”

elif [ "$gradel" => ".80" ] 
then
  gradel=“B”

elif [ "$gradel" => ".75" ] 
then
  gradel=“C”

elif [ "$gradel" =>  ".70" ] 
then
  gradel=“C-”

elif [ "$gradel" => ".65" ] 
then
  gradel="D"

else
  gradel="F"   

fi

echo "$gradel"

2 个答案:

答案 0 :(得分:1)

Bash不支持浮点运算,所以你需要一个可以做到这一点的工具,比如awk。这是一个例子:

wword=$1
grade=$((17-wword))
awk -v g="$grade" 'BEGIN{a=g/17}a>=$1{print $2;exit}' << EOF
1    A+
0.9  A
0.85 B+
0.80 B
0.75 C
0.70 C-
0.65 D
-1   F
EOF

答案 1 :(得分:1)

此计划中存在许多小问题:

  • 你正试图在

    中做算术
    gradel=$('"$wword"' - 17)
    

    但实际上这会尝试将$( )的内容作为命令运行。您希望$(( ))进行算术扩展。

  • '"$wword"'扩展为"$wword":单引号可防止扩展。你想要"$wword"。 (在$(( ))内,即使只是wword也足够了。)

  • 您要将[ ]中的数字与=>进行比较。如果有的话,它应该是>=,对于[ ]中的数字,无论如何都应该使用-ge

  • gradel=“B+”使用非标准双引号。

而最大的问题是:Bash无法进行浮点计算。人们经常使用bc(或awk,Perl,Python ......)。这是一个小bc程序,可以完成你想做的事情:

#!/usr/bin/bc -q
# -q suppresses the copryight message

# Use floating point with three digits after period
scale = 3

# Read from standard input
wword = read()
gradel = (17 - wword) / 17

if (gradel >= 1) {
    print "A+\n"
} else if (gradel >= 0.9) {
    print "A\n"
} else if (gradel >= 0.85) {
    print "B+\n"
} else if (gradel >= 0.8) {
    print "B\n"
} else if (gradel >= 0.75) {
    print "C\n"
} else if (gradel >= 0.7) {
    print "C-\n"
} else if (gradel >= 0.65) {
    print "D\n"
} else {
    print "F\n"
}

quit

像这样使用:

$ for i in 0 1 2 3 4 5 5.5 6; do ./so <<< "$i"; done
A+
A
B+
B
C
C-
D
F

其中so是脚本的名称。

通常,如果你想要的只是一个(或几个)浮点比较作为Bash脚本的一部分,你可以按如下方式嵌入bc:

if (( $(bc <<< "$var > 0.9") )); then
    echo "$var is greater than 0.9"
else
    echo "$var is not greater than 0.9"
fi

其中"$var"是要与0.9进行比较的Bash浮点变量。

这利用了bc打印1进行真实比较,0进行错误比较。 (( ))然后将其转换为退出状态。