在shell脚本中,我们如何比较(整数和浮点),(浮点和浮点),(浮点和整数),(整数和整数)只有一个if条件。
我有一些例子,比如
set X=3.1
set Y=4.1
if [ $X < $Y ] then
echo "wassup"
endif
但是从cron工作运行上面似乎没有用。
答案 0 :(得分:12)
在bash中执行浮点运算的方法是使用几乎所有Linux发行版上都可用的bc。
# bc will return 0 for false and 1 for true
if [ $(echo "23.3 > 7.3" | bc) -ne 0 ]
then
echo "wassup"
fi
Linux期刊上有一个good article关于使用bc的bash中的浮点数学。
答案 1 :(得分:1)
Bah本身只处理整数。使用bc:
echo "$X>$Y" | bc
0
echo "$X<$Y" | bc
1
您无需担心规模问题。它仅适用于输出格式的预分割:
X=3.000001
Y=3.0001
echo "$X>$Y" | bc
0
echo "$X<$Y" | bc
1
echo "scale=1;$X<$Y" | bc
1
答案 2 :(得分:0)
答案 3 :(得分:0)
EDIT。根据对此答案的评论(感谢用户未知和 glenn jackman ),似乎在使用bc
进行 true / false <时/ em> test,所需的bash
测试只是:
(( $(echo "$X < $Y" |bc) ))
...请参阅下面的测试结果和脚本之后,旧样式bash -ne 0
测试需要与[ ]
进行比较。
bash
本身不处理浮点数,但您可以调用bc
等实用程序
来自man bc
- 任意精确计算器语言
X=3.1
Y=4.1
# This test has two superfluous components.
# See EDIT (above) and TESTS below
if (($(echo "scale=9; $X < $Y" |bc)!=0)) ;then
echo "wassup"
fi
测试结果:
if [ "1" ] true
[ "1" ] true
if [ "0" ] true
[ "0" ] true
if [ 1 ] true
[ 1 ] true
if [ 0 ] true
[ 0 ] true
if (( "1" )) true
(( "1" )) true
if (( "0" )) false
(( "0" )) false
if (( 1 )) true
(( 1 )) true
if (( 0 )) false
(( 0 )) false
echo "1<1"|bc true
echo "1<0"|bc true
测试脚本:
printf 'if [ "1" ] '; if [ "1" ]; then echo true; else echo false; fi
printf ' [ "1" ] '; [ "1" ] && echo true || echo false
printf 'if [ "0" ] '; if [ "0" ]; then echo true; else echo false; fi
printf ' [ "0" ] '; [ "0" ] && echo true || echo false
echo
printf 'if [ 1 ] '; if [ 1 ]; then echo true; else echo false; fi
printf ' [ 1 ] '; [ 1 ] && echo true || echo false
printf 'if [ 0 ] '; if [ 0 ]; then echo true; else echo false; fi
printf ' [ 0 ] '; [ 0 ] && echo true || echo false
echo
printf 'if (( "1" )) '; if (("1")); then echo true; else echo false; fi
printf ' (( "1" )) '; (("1")) && echo true || echo false
printf 'if (( "0" )) '; if (("0")); then echo true; else echo false; fi
printf ' (( "0" )) '; (("0")) && echo true || echo false
echo
printf 'if (( 1 )) '; if (( 1 )); then echo true; else echo false; fi
printf ' (( 1 )) '; (( 1 )) && echo true || echo false
printf 'if (( 0 )) '; if (( 0 )); then echo true; else echo false; fi
printf ' (( 0 )) '; (( 0 )) && echo true || echo false
echo
printf 'echo "1<1"|bc '; echo "1<1"|bc >/dev/null && echo true || echo false
printf 'echo "1<0"|bc '; echo "1<0"|bc >/dev/null && echo true || echo false