如何在 bash if 语句中使用 bc?
How to use bc in bash if statement?
我正在尝试使用 bc 将 if 语句中的值与小数进行比较。
我不确定我是否在 if statement
中正确使用了 bc,因为它似乎不起作用。它总是进入第4个if statement
“IF4
”。其他条件好像没读好?
#SET INITIAL SPEED
initialspeed() {
wpm=0
echo wpm: $wpm
#CHECKS IF SPEED WAS GIVEN
if [ -z "$wpm" ]
then
let wpm=0.6
echo IF1 wpm: $wpm #DEBUG
#CHECK IF SPEED IS VALID
elif [ 'echo "if$($wpm > 0.6)1;if$($wpm<=0.6)0" | bc' = 1 ]
then
echo IF2 wpm: $wpm #DEBUG
echo Error speed is less than 100 wpm
exit 3
elif [ 'echo "if$($wpm < 0.06)1;if$($wpm<=0.06)0" | bc' = 1 ]
then
echo IF3 wpm: $wpm #DEBUG
echo Error speed is more than 1000 wpm
exit 3
else
wpm=$(echo "scale=2;60/ | bc")
echo IF4 wpm: $wpm #DEBUG
fi
}
编辑:
我实际上正在尝试编写类似于 "spritz" 速度 reader 的脚本。 $1 是要读取的文件,$2 是文字显示在屏幕上的速度。 $2 是可选参数,如果没有给出我设置默认速度。
给定的速度应该在100到1000wpm之间(计算前0.6到0.06)
您正在尝试使用进程替换,但您用的是单引号而不是反引号。单引号内的文本只是 Bash 的文字字符串。您正在寻找反引号:
if [ `command` = "result" ]; then # notice `command` vs 'command'
但首选的现代语法是
if [ $(command) = "result" ]; then
但这仍然相当复杂——通常,您需要像
这样的东西
if command; then
其中 command
可能比您原来的稍微复杂一些。
在这种特殊情况下,我会将您的逻辑包装在一个简单的 Awk 脚本中。
你应该用wpm值来调用它;如果缺少,则提供默认值 0.6。
initialspeed() {
local wpm
wpm=${1:-0.6}
echo "wpm: $wpm" >&2 # notice quoting
echo "$wpm" | awk ' > 0.6 {
print "Error: speed is less than 100 wpm" >"/dev/stderr"; exit 3 }
< 0.06 { # You had < 0.06 vs <= 0.06 but I guess this is what you meant
print "Error: speed is more than 1000 wpm" >"/dev/stderr"; exit 3 }
{ printf "%2.2f\n", 60/ }'
}
您的原始脚本显然对值 0.06 进行了错误的比较。现在来看,我猜您实际上希望该值介于 0.06 和 0.6 之间,包括端值;但无论如何,这只是供您参考的草图。
如果您打算 return 0 或 1,具体取决于 wpm 值,您需要这样的东西
echo "if ( $wpm > 0.6 ) 1 else 0" | bc
您可以使用
将您的测试通过管道传输到 bc
echo "$wpm > 0.06" | bc
可以使用
测试结果
if [ $(echo "$wpm > 0.06" | bc) -eq 1 ]; then
echo "You are going to fast"
else
echo "Slow"
fi
我正在尝试使用 bc 将 if 语句中的值与小数进行比较。
我不确定我是否在 if statement
中正确使用了 bc,因为它似乎不起作用。它总是进入第4个if statement
“IF4
”。其他条件好像没读好?
#SET INITIAL SPEED
initialspeed() {
wpm=0
echo wpm: $wpm
#CHECKS IF SPEED WAS GIVEN
if [ -z "$wpm" ]
then
let wpm=0.6
echo IF1 wpm: $wpm #DEBUG
#CHECK IF SPEED IS VALID
elif [ 'echo "if$($wpm > 0.6)1;if$($wpm<=0.6)0" | bc' = 1 ]
then
echo IF2 wpm: $wpm #DEBUG
echo Error speed is less than 100 wpm
exit 3
elif [ 'echo "if$($wpm < 0.06)1;if$($wpm<=0.06)0" | bc' = 1 ]
then
echo IF3 wpm: $wpm #DEBUG
echo Error speed is more than 1000 wpm
exit 3
else
wpm=$(echo "scale=2;60/ | bc")
echo IF4 wpm: $wpm #DEBUG
fi
}
编辑: 我实际上正在尝试编写类似于 "spritz" 速度 reader 的脚本。 $1 是要读取的文件,$2 是文字显示在屏幕上的速度。 $2 是可选参数,如果没有给出我设置默认速度。
给定的速度应该在100到1000wpm之间(计算前0.6到0.06)
您正在尝试使用进程替换,但您用的是单引号而不是反引号。单引号内的文本只是 Bash 的文字字符串。您正在寻找反引号:
if [ `command` = "result" ]; then # notice `command` vs 'command'
但首选的现代语法是
if [ $(command) = "result" ]; then
但这仍然相当复杂——通常,您需要像
这样的东西if command; then
其中 command
可能比您原来的稍微复杂一些。
在这种特殊情况下,我会将您的逻辑包装在一个简单的 Awk 脚本中。
你应该用wpm值来调用它;如果缺少,则提供默认值 0.6。
initialspeed() {
local wpm
wpm=${1:-0.6}
echo "wpm: $wpm" >&2 # notice quoting
echo "$wpm" | awk ' > 0.6 {
print "Error: speed is less than 100 wpm" >"/dev/stderr"; exit 3 }
< 0.06 { # You had < 0.06 vs <= 0.06 but I guess this is what you meant
print "Error: speed is more than 1000 wpm" >"/dev/stderr"; exit 3 }
{ printf "%2.2f\n", 60/ }'
}
您的原始脚本显然对值 0.06 进行了错误的比较。现在来看,我猜您实际上希望该值介于 0.06 和 0.6 之间,包括端值;但无论如何,这只是供您参考的草图。
如果您打算 return 0 或 1,具体取决于 wpm 值,您需要这样的东西
echo "if ( $wpm > 0.6 ) 1 else 0" | bc
您可以使用
将您的测试通过管道传输到 bcecho "$wpm > 0.06" | bc
可以使用
测试结果if [ $(echo "$wpm > 0.06" | bc) -eq 1 ]; then
echo "You are going to fast"
else
echo "Slow"
fi