Случайное число от диапазона в Сценарии Bash

Я должен генерировать число случайного порта между 2000-65000 из сценария оболочки. Проблема $RANDOM 15-разрядное число, таким образом, я застреваю!

PORT=$(($RANDOM%63000+2001)) работал бы приятно, если бы это не было для ограничения размера.

Делает у любого есть пример того, как я могу сделать это, возможно, путем извлечения чего-то из /dev/urandom и получая его в диапазоне?

177
задан rpr 23 August 2017 в 12:03
поделиться

6 ответов

shuf -i 2000-65000 -n 1

Наслаждайтесь!

Edit : диапазон включительно.

361
ответ дан 23 November 2019 в 20:17
поделиться

Вы можете сделать это

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.

5
ответ дан 23 November 2019 в 20:17
поделиться

Самый простой общий способ, который приходит на ум, - это однострочный 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

Это прочитает два байта и напечатает их как целое число без знака; вам все еще нужно сделать вырезку.

15
ответ дан 23 November 2019 в 20:17
поделиться

Вот еще один. Я думал, что это сработает практически с чем угодно, но опция sort random недоступна на моем компьютере с centos на работе.

 seq 2000 65000 | sort -R | head -n 1
5
ответ дан 23 November 2019 в 20:17
поделиться

, а вот один с Python

randport=$(python -S -c "import random; print random.randrange(2000,63000)")

и один с awk

awk 'BEGIN{srand();print int(rand()*(63000-2000))+2000 }'
36
ответ дан 23 November 2019 в 20:17
поделиться

В Mac OS X и FreeBSD вы также можете использовать jot:

jot -r 1  2000 65000
76
ответ дан 23 November 2019 в 20:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: