答案1
请参阅uuidgen
属于e2fsprogs包裹。
根据这,libuuid
现在是util-linux并且 e2fsprogs 中的包含正在逐步淘汰。但是,在新的 Ubuntu 系统上,uuidgen
现在包含在uuid-runtime
软件包中。
要创建 uuid 并将其保存在变量中:
uuid=$(uuidgen)
在我的 Ubuntu 系统上,字母字符以小写形式输出,而在我的 OS X 系统上,它们以大写形式输出(感谢 David 在评论中指出这一点)。
要切换到全部大写(按照上述方法生成后):
uuid=${uuid^^}
要切换到全部小写:
uuid=${uuid,,}
例如,如果您有两个 UUID,并且想要在 Bash 中比较它们,忽略它们的大小写,您可以tolower()
像这样进行样式比较:
if [[ ${uuid1,,} == ${uuid2,,} ]]
答案2
为了在不添加外部依赖的情况下增加多样性,Linux你可以做:
UUID=$(cat /proc/sys/kernel/random/uuid)
为了传播不良做法,FreeBSD,在 Linux 兼容层(Linuxulator?)下,
UUID=$(cat /compat/linux/proc/sys/kernel/random/uuid)
参考:
答案3
只是为了完整性... dbus
Debian 上的软件包中还安装了 UUID 生成器。我之前没看到它。它可能与 e2fsprogs 软件包的算法相同,但它没有添加破折号,因此对您来说可能更简洁一些:
$ uuidgen
387ee6b9-520d-4c51-a9e4-6eb2ef15887d
$ dbus-uuidgen
d17b671f98fced5649a856a54b51c9e6
Grawity 添加了一条安全提示:“DBus UUID 与以下项不相关或不兼容:RFC 4122。 除了,dbus-uuidgen总是使用 Unix 时间戳作为最后 4 个字节。因此它们可能不适合某些用途。”(谢谢 Grawity,我应该在手册页中发现这一点。)
答案4
我发现这个脚本“一行”在 uuidgen 不可用时很有用。这还可以避免为 Perl 或 Python 安装外部模块的必要性。
od -x /dev/urandom | head -1 | awk '{OFS="-"; print $2$3,$4,$5,$6,$7$8$9}'
在 SnowLeopard、Red Hat Valhalla、Solaris 9 4/04 及更新版本上测试成功。我很好奇这是否容易出现非唯一性,但在过去 10 年里我还没有被“咬”过。当然,也head -1
可以用 too 代替head -_other-value_ | tail -1
。
解释,
/dev/random
和/dev/urandom
是内核随机生成器。
od
(八进制转储)有一个十六进制输出开关(-x),每行产生 16 个字节。
head
-n [| tail -1](其中 n>0)仅提取前一个输出的一行。
awk
将打印语句中出现逗号的所有位置的 OutputFieldSeparator 设置为连字符。通过单独指定字段 2-9,我们可以控制连字符并删除“od”作为每行输出前缀的索引/偏移计数器。
结果是8-4-4-4-12
小写字符的模式a-f0-9
。
993bb8d7-323d-b5ee-db78-f976a59d8284