【发布时间】:2020-05-25 15:44:09
【问题描述】:
我想用我的 bash 脚本生成长度在 1-4 之间的字符串。我知道如何创建具有设定长度的字符串,但想知道是否对以下命令进行了细微更改以使其在 1-4 长度之间进行选择。
cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 4
这将创建标准长度为 4 的数字/字母字符串。有什么方法可以调整它以满足我的需要?
【问题讨论】:
我想用我的 bash 脚本生成长度在 1-4 之间的字符串。我知道如何创建具有设定长度的字符串,但想知道是否对以下命令进行了细微更改以使其在 1-4 长度之间进行选择。
cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 4
这将创建标准长度为 4 的数字/字母字符串。有什么方法可以调整它以满足我的需要?
【问题讨论】:
不是最聪明的解决方案,但我猜这应该可行
cat /dev/urandom | tr -dc A-Za-z0-9 | head -c "$(shuf -i 1-4 -n 1)"
【讨论】:
cat。还可以使用字符类和切换语言环境以获得跨系统的一致结果:LC_ALL=POSIX tr -dc '[:alnum:]' </dev/urandom | head -c "$(shuf -i 1-4 -n 1)"
这很简单:使用随机数/字符生成器来生成head -c 的参数。
在bash 中,您可以将内置变量$RANDOM 与算术表达式一起使用。随机数不是很好(尤其是在使用% someBigNumber 时)但对于大多数情况来说已经足够了:
< /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)"
【讨论】:
这里是生成n个随机最小长度到最大长度的随机字符串的方法:
它读取随机[:alnum:]字母数字字符流;每次使用不同的随机数,并将其存储在一个数组中。
此方法通过以下方式最大限度地提高效率:
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
【讨论】: