使用 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
进行假比较。 (( ))
然后将其转换为退出状态。
我在使用测试脚本获得特定结果时遇到了一些错误。
我想根据存储在文件夹中的文档计算 单词列表,然后
变量"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
.
这利用 bc 打印 1
进行真比较,0
进行假比较。 (( ))
然后将其转换为退出状态。