Как сравнить число с диапазоном в bash или Perl? - PullRequest
3 голосов
/ 28 февраля 2009

Как написать сценарий сравнения числа с диапазоном?

1 не в пределах 2-5

или

3 в пределах 2-5

Ответы [ 7 ]

18 голосов
/ 28 февраля 2009

Еще лучше в Perl6.

Операторы сравнения в цепочке:

if( 2 <= $x <= 5 ){
}

Оператор Smart-Match:

if( $x ~~ 2..5 ){
}

Junctions:

if( $x ~~ any 2..5 ){
}

Дано / При операторах:

given( $x ){
  when 2..5 {
  }
  when 6..10 {
  }
  default{
  }
}
12 голосов
/ 28 февраля 2009

В Perl:

if( $x >= lower_limit && $x <= upper_limit ) {
   # $x is in the range
}
else {
   # $x is not in the range
}
11 голосов
/ 28 февраля 2009

В Баш:

$ if [[ 1 -gt 2 && 1 -lt 5 ]]; then echo "true"; fi
$ if [[ 3 -gt 2 && 1 -lt 5 ]]; then echo "true"; fi
true
8 голосов
/ 01 марта 2009

Оператор умного сопоставления также доступен в Perl 5.10:

if ( $x ~~ [2..5] ) {
    # do something
}
2 голосов
/ 22 апреля 2009

В Баш:

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
1 голос
/ 06 сентября 2012

Версия теста [[ поддерживает регулярные выражения начиная с 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
0 голосов
/ 02 марта 2009

В 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:~]$ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...