function random_str() {
len=$1
if [[ -z ${len} ]]; then
len=16
fi
uuid=None
if command -v dmidecode &>/dev/null; then
uuid=$(dmidecode -t 1 | grep UUID | awk '{print $2}' | base64 | head -c ${len})
fi
if [[ "${#uuid}" == "${len}" ]]; then
echo "${uuid}"
else
head -c100 < /dev/urandom | base64 | tr -dc A-Za-z0-9 | head -c ${len}; echo
fi
}
这个 Bash 函数 random_str
的目的是生成一个随机字符串。它接受一个参数,即随机字符串的长度。下面是对这个函数的逐行解释:
-
function random_str() {
:这一行定义了一个名为random_str
的函数。 -
len=$1
:这一行将函数的第一个参数赋值给变量len
。这个参数应该是想要生成的随机字符串的长度。 -
if [[ -z ${len} ]]; then
:这一行检查变量len
是否为空(即没有提供长度参数)。 -
len=16
:如果len
为空,那么将其默认设置为 16。 -
fi
:这一行结束了 if 语句。 -
uuid=None
:这一行初始化了一个名为uuid
的变量,并将其设置为字符串 “None”。 -
if command -v dmidecode &>/dev/null; then
:这一行检查系统中是否存在dmidecode
命令。command -v dmidecode
会返回dmidecode
命令的路径,如果存在的话。&>/dev/null
将标准输出和标准错误都重定向到/dev/null
,这意味着不会在终端上显示任何输出。 -
uuid=$(dmidecode -t 1 | grep UUID | awk '{print $2}' | base64 | head -c ${len})
:如果存在dmidecode
命令,这一行会尝试使用它来生成一个基于硬件UUID的随机字符串。dmidecode -t 1
:使用dmidecode
命令获取系统信息,-t 1
表示只获取类型为 1 的信息,即系统信息。grep UUID
:从dmidecode
的输出中查找包含 “UUID” 的行。awk '{print $2}'
:使用awk
命令打印每行的第二个字段,即 UUID 的值。base64
:将 UUID 的值转换为 base64 编码。head -c ${len}
:只获取前len
个字符。
-
fi
:这一行结束了 if 语句。 -
if [[ "${#uuid}" == "${len}" ]]; then
:这一行检查uuid
变量的长度是否等于len
。 -
echo "${uuid}"
:如果uuid
的长度等于len
,则输出uuid
。 -
else
:如果uuid
的长度不等于len
,则执行 else 语句块。 -
head -c100 < /dev/urandom | base64 | tr -dc A-Za-z0-9 | head -c ${len}; echo
:这一行是生成随机字符串的另一种方法,它在dmidecode
不可用或者生成的字符串长度不正确时使用。head -c100 < /dev/urandom
:从/dev/urandom
设备读取前 100 个字符,这是一个生成随机数据的特殊设备。base64
:将随机数据转换为 base64 编码。tr -dc A-Za-z0-9
:使用tr
命令删除所有不是字母和数字的字符。head -c ${len}
:只获取前len
个字符。echo
:在最后输出字符串时,添加一个换行符。
-
fi
:这一行结束了 if-else 语句。 -
}
:这一行结束了函数定义。
总结来说,这个函数 random_str
会尝试使用系统的 dmidecode
命令生成一个基于硬件UUID的随机字符串,如果这个方法不可用或者生成的字符串长度不正确,它会使用 /dev/urandom
生成一个纯随机的字符串。函数最终会输出一个指定长度的随机字符串。