我在使用测试脚本实现特定结果时遇到了一些错误。
我想从存储在文件夹中的文档中计算单词列表然后
变量"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"
答案 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
进行错误比较。 (( ))
然后将其转换为退出状态。