【发布时间】:2013-12-24 15:18:34
【问题描述】:
在shell脚本中,我们如何比较(整数和浮点),(浮点和浮点),(浮点和整数),(整数和整数)只有一个if条件。
我有几个例子像
set X=3.1
set Y=4.1
if [ $X < $Y ] then
echo "wassup"
endif
但从 cron 作业运行上述内容似乎不起作用。
【问题讨论】:
在shell脚本中,我们如何比较(整数和浮点),(浮点和浮点),(浮点和整数),(整数和整数)只有一个if条件。
我有几个例子像
set X=3.1
set Y=4.1
if [ $X < $Y ] then
echo "wassup"
endif
但从 cron 作业运行上述内容似乎不起作用。
【问题讨论】:
在 bash 中执行浮点运算的方法是使用bc,它在几乎所有的 linux 发行版上都可用。
# 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 中的浮点数学。
【讨论】:
$(echo "$a > $b" | bc) 没有返回值。你可以自己试试 subshell 吗?
echo $X 将是一个空行。
Bah 本身只处理整数。使用 bc:
echo "$X>$Y" | bc
0
echo "$X<$Y" | bc
1
您无需担心规模问题。它只是为了输出格式的preocision:
X=3.000001
Y=3.0001
echo "$X>$Y" | bc
0
echo "$X<$Y" | bc
1
echo "scale=1;$X<$Y" | bc
1
【讨论】:
【讨论】:
$ test "34.4" -gt "5.4" -> bash: test: 34.4: integer expression expected
bash --version 给我GNU bash, version 4.2.8(1)-release (x86_64-pc-linux-gnu)
编辑。基于这个答案的 cmets(感谢 user unknown 和 glenn jackman),似乎当使用 bc 来表示 true/false 测试,所需的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
【讨论】:
scale 是多余的,如果你只是想测试真假。 !=0 也是多余的 - 已经完成了。
!=0 不是 多余的:bc 打印 0 或 1 表示假或真。在这两种情况下,退出状态都是零。因此,您必须将命令输出与某些内容进行比较。
if (($(echo "$X > $Y" | bc))) ; then echo wassup; else echo pussaw; fi。原因:$(...) 捕获输出。 ((...)) 评估。