在shell本身没有实现浮点运算的便携方法。你需要求助于外部项目。在
您可以使用AWK代替Python,它的upstart开销明显更小。注意,它不理解Python奇特的x < y < z语法,因此您必须将其重写为x < y && y < z。你可以定义这个小Bash函数。在## usage: is_between VALUE UPPER LOWER
##
## Checks whether VALUE is truly between UPPER and LOWER.
##
function is_between {
awk "BEGIN { exit(!($2 < $1 && $1 < $3)); }"
}
它将通过退出状态返回答案,以便可以直接在条件内使用。例如:
^{pr2}$
我写了一个小基准。请注意,我实际上是在比较整数,而不是实数,因此我可以与shell内置函数进行比较。在#!/bin/sh -eu
what=
if [ ${#} -gt 0 ]
then
what=$1
fi
case $what in
awk)
function is_between {
awk "BEGIN { exit(!($2 < $1 && $1 < $3)); }"
}
;;
python)
function is_between {
python -c "import sys; sys.exit(not ($2 < $1 < $3));"
}
;;
*)
# This one only works for integers!
function is_between {
return $((!($2 < $1 && $1 < $3)))
}
;;
esac
i=0
count=0
while [ $i -lt 1000 ]
do
value="$RANDOM"
lower="$RANDOM"
upper="$RANDOM"
if is_between $value $lower $upper
then
count=$(($count + 1))
fi
i=$(($i + 1))
done
echo "$count values were in between"
以下是我的计时结果:$ time ./test.sh
152 values were in between
real 0m0.055s
user 0m0.053s
sys 0m0.000s
$ time ./test.sh python
146 values were in between
real 0m33.354s
user 0m27.570s
sys 0m4.047s
$ time ./test.sh awk
157 values were in between
real 0m5.486s
user 0m3.503s
sys 0m0.723s
正如你所看到的,差异是非常显著的