我尝试validation,如果一个数字与小数之间的指定范围内,我的意思是像下面的例子:
rangeA=58.5 rangeB=61.5 number=62.7 if [[ ( "$number" > "$rangeA" | bc ) || ( "$number" = "$rangeA" | bc ) ]] && [[ ( "$number" < "$rangeB" | bc ) || ( "number" = "rangeB" | bc ) ]]; then
但我卡在这个操作,我会感谢您的帮助,谢谢
Bash的<
和>
比较字符串, -lt
和-gt
比较整数,比较浮点数的唯一方法是把shell放到bc(1)
(你这样做,但是你做错了):
rangeA=58.5 rangeB=61.5 number=62.7 if (( $(bc <<<"$number >= $rangeA && $number <= $rangeB") )); then echo yes else echo no fi
bc
打印1或0到标准输出,bash的算术上下文( ((expression))
)测试它为零,并相应地设置状态码。
你可以使用awk:
rangeA=58.5 rangeB=61.5 number=62.7 if awk -v number=$number -v rangeA=$rangeA -v rangeB=$rangeB ' BEGIN{exit !(number >= rangeA && number <= rangeB)}' then echo "condition matched" else echo "condition didn't match" fi
bc
可以使用“和”, &&
或“or”, ||
来对数字进行复杂的测试 ,逻辑。 如果条件为真,则bc
1
到stdout。 我们可以使用grep -q 1
来测试grep -q 1
,其中-q
选项告诉grep
安静,并且在stdout上不产生任何东西:
if bc <<< "$number >= $rangeA && $number <= $rangeB" | grep -q 1 then echo True else echo False fi
不知道如果你是一个需求,但你也可以在awk
使用三元运算符:
awk -vn=$number -va=$rangeA -vb=$rangeB \ 'BEGIN{print(n >= a && n <= b)?"yes":"no"}'
一种隐含的if-else。