$ grep -oP '\K[0-9.]+(?=:.*)' < ips.txt
10.173.36.73
10.173.36.74
10.173.36.75
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 -цифр случайных чисел, а второй прервется после одной строки.
Если вам не нужна безопасность, вы можете использовать встроенную в 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 цифр.