Поместить содержимое /dev/urandom в переменную?

$ grep -oP '\K[0-9.]+(?=:.*)' < ips.txt
10.173.36.73
10.173.36.74
10.173.36.75
0
22.06.2021, 12:02
2 ответа

fold просто свернет бесконечный поток цифр, и поэтому aопределяется бесконечно. Вам нужно будет добавить завершающую команду, простейшуюhead:

 a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1)"

Просто сравните поведение этих двух команд

tr -dc '[:digit:]' < /dev/urandom | fold -w 4  
tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1

Первый покажет бесконечный поток из 4 -цифр случайных чисел, а второй прервется после одной строки.

0
28.07.2021, 11:23

Если вам не нужна безопасность, вы можете использовать встроенную в bash переменную -в RANDOM. Чтобы получить случайное число от 0 до 9999 включительно, $((RANDOM % 10000))дает небольшое смещение в сторону значений меньше 767, поскольку значения $RANDOMоднородны в диапазоне [0, 32767]. Чтобы получить равномерное распределение, поставьте ведущие нули:

while a=$((RANDOM + 10000)); ((a <= 39999)); do :; done
a=${a#?}

Еще раз обратите внимание, что это неприменимо везде, где важна безопасность. Вывод из $RANDOMне является непредсказуемым.

Если вам нужна безопасность, то /dev/urandom— это подходящее место для получения случайных данных. Вызов foldне нужен на большинстве современных юникодов :, вы можете получить 4 символа с помощью head -c.

a=$(</dev/urandom tr -dc 0-9 | head -c 4)

head -cне является POSIX и отсутствует в OpenBSD, но присутствует в других BSD и в Linux (как с GNU coreutils, так и с BusyBox ).

Если вам нужна переносимость на системы, в которых нет head -c, то fold -w 4 | head -n 1— хорошая замена стандарту POSIX. Просто обратите внимание, что вам нужен вызов head, иначе foldбудет вечно выводить строки из 4 цифр.

1
28.07.2021, 11:23

Теги

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