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

Mathematical equations using if-else statements

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

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

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

的推理

我目前遇到的问题是 "unary operator expected" 并且这行代码 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"

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

wword=
grade=$((17-wword))
awk -v g="$grade" 'BEGIN{a=g/17}a>={print ;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

这个程序有很多小问题:

  • 您正试图在

    中进行算术运算
    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 进行假比较。 (( )) 然后将其转换为退出状态。