Я должен генерировать число случайного порта между 2000-65000
из сценария оболочки. Проблема $RANDOM
15-разрядное число, таким образом, я застреваю!
PORT=$(($RANDOM%63000+2001))
работал бы приятно, если бы это не было для ограничения размера.
Делает у любого есть пример того, как я могу сделать это, возможно, путем извлечения чего-то из /dev/urandom
и получая его в диапазоне?
shuf -i 2000-65000 -n 1
Наслаждайтесь!
Edit : диапазон включительно.
Вы можете сделать это
cat /dev/urandom|od -N2 -An -i|awk -v f=2000 -v r=65000 '{printf "%i\n", f + r * $1 / 65536}'
Если вам нужны подробности, смотрите Shell Script Random Number Generator.
Самый простой общий способ, который приходит на ум, - это однострочный Perl:
perl -e 'print int(rand(65000-2000)) + 2000'
Вы всегда можете просто использовать два числа:
PORT=$(($RANDOM + ($RANDOM % 2) * 32768))
Вы все равно должны обрезать ваш диапазон. Это не общий метод n-битных случайных чисел, но он будет работать в вашем случае, и все это внутри bash.
Если вы хотите быть очень милым и читать из / dev / urandom, вы можете сделать это:
od -A n -N 2 -t u2 /dev/urandom
Это прочитает два байта и напечатает их как целое число без знака; вам все еще нужно сделать вырезку.
Вот еще один. Я думал, что это сработает практически с чем угодно, но опция sort random недоступна на моем компьютере с centos на работе.
seq 2000 65000 | sort -R | head -n 1
, а вот один с Python
randport=$(python -S -c "import random; print random.randrange(2000,63000)")
и один с awk
awk 'BEGIN{srand();print int(rand()*(63000-2000))+2000 }'
В Mac OS X и FreeBSD вы также можете использовать jot:
jot -r 1 2000 65000