在shell脚本中,我们如何使用一个if条件语句来比较整数、浮点数、浮点数与浮点数、浮点数与整数以及整数与整数。
我有一些例子:
set X=3.1
set Y=4.1
if [ $X < $Y ] then
echo "wassup"
endif
但是在定时任务中运行上述命令似乎不起作用。
$(echo "$a > $b" | bc)
没有返回值。你能试试子shell吗? - briceecho $X
将会输出一个空行。 - briceBah本身只处理整数。请使用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
$ test "34.4" -gt "5.4" -> bash: test: 34.4: integer expression expected
- bricebash --version
告诉我 GNU bash, version 4.2.8(1)-release (x86_64-pc-linux-gnu)
。 - brice根据这个答案的评论(感谢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
!=0
不是多余的:因为 bc
会打印出 false 或 true 的 0 或 1。在这两种情况下,退出状态 都是零。因此,你必须将命令输出与某些内容进行比较。 - glenn jackmanif (($(echo "$X > $Y" | bc))) ; then echo wassup; else echo pussaw; fi
。原因:$(...) 捕获输出。((...)) 评估。 - user unknown