如何编写一个脚本来比较数字与范围?
1不在2-5之间
或者
3在2-5之间
Perl6
中,它甚至更好。链式比较运算符:
if( 2 <= $x <= 5 ){
}
智能匹配运算符:
if( $x ~~ 2..5 ){
}
连接点:
if( $x ~~ any 2..5 ){
}
给定 / 当操作符:
given( $x ){
when 2..5 {
}
when 6..10 {
}
default{
}
}
if( $x >= lower_limit && $x <= upper_limit ) {
# $x is in the range
}
else {
# $x is not in the range
}
$ if [[ 1 -gt 2 && 1 -lt 5 ]]; then echo "true"; fi
$ if [[ 3 -gt 2 && 1 -lt 5 ]]; then echo "true"; fi
true
智能匹配操作符在 Perl 5.10 中也是可用的:smart match operator
if ( $x ~~ [2..5] ) {
# do something
}
x=9; p="\<$x\>"; if [[ $(echo {10..20}) =~ $p ]]; then echo true; else echo false; fi
已编辑以正确处理下面评论中提到的条件。
rangecheck () { local p="\<$1\>"; if [[ $(echo {10..20}) =~ $p ]]; then echo true; else echo false; fi; }
for x in {9..21}; do rangecheck "$x"; done
false
true
.
.
.
true
false
if [[ $(echo {10..20}) =~ 9 ]]; then echo true; fi
返回 true。不过这个想法不错,可以改进一下吗?(我对 Bash 的知识不是很丰富) - sharat87In perl
grep {/^$number$/} (1..25);
如果数字在范围内,将返回真值;否则返回假值。
例如:
[dsm@localhost:~]$ perl -le 'print "has `$ARGV[0]`" if grep {/^$ARGV[0]$/} (1..25)' 4
has `4`
[dsm@localhost:~]$ perl -le 'print "has `$ARGV[0]`" if grep {/^$ARGV[0]$/} (1..25)' 456
[dsm@localhost:~]$
自Bash 3.0版本开始,[[
测试的支持正则表达式。
[[ 3 =~ ^[2-5]$ ]]; echo $? # 0
在测试中,数值比较运算符有时会返回错误,如果输入不是数字:
[[ 1a -ge 1 ]]; echo $? # value too great for base (error token is "1a")
[[ '$0' -le 24 ]] # syntax error: operand expected (error token is "$o")
=〜
来测试输入是否为整数:x=a23; [[ "$x" =~ ^[0-9]+$ && "$x" -ge 1 && "$x" -le 24 ]]; echo $? # 1
x=-23; [[ "$x" =~ ^-?[0-9]+$ && "$x" -ge -100 && "$x" -le -20 ]]; echo $? # 0