Генерация строк с разными границами с помощью скрипта bash - PullRequest
1 голос
/ 25 мая 2020

Я хочу сгенерировать строки длиной от 1 до 4 с помощью моего bash скрипта. Я знаю, как создавать строки с заданной длиной, но хочу знать, есть ли небольшое изменение в следующей команде, чтобы она могла выбирать длину от 1 до 4.

cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 4

Это создаст строки с числами / буквы стандартной длины 4. Есть ли способ настроить его под свои нужды?

Ответы [ 3 ]

2 голосов
/ 25 мая 2020

Это просто: используйте генератор случайных чисел / символов, чтобы сгенерировать аргумент для head -c.

В bash вы можете использовать встроенную переменную $RANDOM вместе с арифметическими c выражение. Случайные числа не так хороши (особенно при использовании % someBigNumber), но достаточны для большинства сценариев ios:

< /dev/urandom tr -dc A-Za-z0-9 | head -c "$((RANDOM % 4 + 1))"

Если вам нужна лучшая случайность или переносимый сценарий, снова используйте /dev/urandom:

< /dev/urandom tr -dc A-Za-z0-9 | head -c "$(< /dev/urandom tr -dc 1-4 | head -c 1)"
2 голосов
/ 25 мая 2020

Не самое умное решение, но я думаю, это должно сработать

cat /dev/urandom | tr -dc A-Za-z0-9 | head -c "$(shuf -i 1-4 -n 1)"
0 голосов
/ 26 мая 2020

Здесь метод для генерации n случайных строк от случайной минимальной длины до максимальной длины:

Он читает поток случайных [:alnum:] буквенно-цифровых c символов; каждый раз с разным случайным количеством и сохраните его в массиве.

Этот метод максимизирует эффективность за счет:

  • использования встроенных функций Bash.
  • Один вызов внешней команды tr.
  • Чтение случайных байтов без знака из /dev/urandom устройства быстрого генератора случайных чисел.
#!/usr/bin/env bash

# count: Number of strings to generate
# l_min: Minimum length of string
# l_max: Maximum length of string

declare -i count=10 l_min=4 l_max=8

# Array containing random strings

declare -a rand_strings=()

declare -i i=0
while [ $i -lt $count ]; do
  declare -i l=$((RANDOM%(l_max-l_min+1)+l_min))
  read -r -N $l rand_strings[i]
  i=$((i+1))
done < <(
  LC_ALL=POSIX
  tr -dc '[:alnum:]' </dev/urandom
)

printf '%d ranndom strings of %d to %d characters\n' $count $l_min $l_max
printf '%q\n' "${rand_strings[@]}"

Пример вывода:

10 ranndom strings of 4 to 8 characters
4QeeD9oT
GZQ7dD0
r3wb5D
17HBZhp
SP1i
t1OHq
1L4qpz7T
F5zG
Dw9HQ
ysG2chf
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...