# Generate a pseudo UUID
uuid()
{
local N B T
for (( N=0; N < 16; ++N ))
do
B=$(( $RANDOM%255 ))
if (( N == 6 ))
then
printf '4%x' $(( B%15 ))
elif (( N == 8 ))
then
local C='89ab'
printf '%c%x' ${C:$(( $RANDOM%${#C} )):1} $(( B%15 ))
else
printf '%02x' $B
fi
for T in 3 5 7 9
do
if (( T == N ))
then
printf '-'
break
fi
done
done
echo
}
[ "$0" == "$BASH_SOURCE" ] && uuid
$ perl -e 'use UUID; UUID::generate($uuid); UUID::unparse($uuid, $string); print "my new UUID is $string \n";'
my new UUID is 3079e9ce-41d4-4cf3-9f90-d12f8bb752e4
这将是微不足道的添加到带有反引号或$()符号的 shellscript:
#!/bin/bash
# ...do some stuff
$myvar = $(perl -e 'use UUID; UUID::generate($uuid); UUID::unparse($uuid, $string); print "$string";')
# ...do some more stuff
# uuid [count]
#
# Generate type 4 (random) UUID, or [count] type 4 UUIDs.
function uuid()
{
local count=1
if [[ ! -z "$1" ]]; then
if [[ "$1" =~ [^0-9] ]]; then
echo "Usage: $FUNCNAME [count]" >&2
return 1
fi
count="$1"
fi
python -c 'import uuid; print("\n".join([str(uuid.uuid4()).upper() for x in range('"$count"')]))'
}
如果您更喜欢小写,请更改:
python -c 'import uuid; print("\n".join([str(uuid.uuid4()).upper() for x in range('"$count"')]))'
至:
python -c 'import uuid; print("\n".join([str(uuid.uuid4()) for x in range('"$count"')]))'
请参阅作为e2fsprogs软件包
uuidgen
一部分的程序。据此,现在
libuuid
是util-linux的一部分,并且正在逐步淘汰 e2fsprogs 中的包含。但是,在新的 Ubuntu 系统上,uuidgen
现在包含在uuid-runtime
包中。要创建 uuid 并将其保存在变量中:
在我的 Ubuntu 系统上,字母字符以小写形式输出,而在我的 OS X 系统上,它们以大写形式输出(感谢 David 在评论中指出这一点)。
切换到全部大写(如上生成后):
切换到全部小写:
例如,如果你有两个 UUID,并且你想在 Bash 中比较它们,忽略它们的大小写,你可以
tolower()
像这样进行样式比较:要在不添加外部依赖项的情况下添加多样性,在Linux上,您可以执行以下操作:
为了传播不良做法,在FreeBSD上,在 linux 兼容层(linuxulator?)下,
参考:
只是为了完整起见......
dbus
在Debian上还安装了一个UUID生成器。我错过了它早些时候环顾四周。它可能与 e2fsprogs 包的算法相同,但它不添加破折号,所以它可能对你来说更干净一点:Grawity 添加了一个安全提示:“DBus UUID 与RFC 4122无关或不兼容。此外,dbus-uuidgen始终使用 Unix 时间戳作为最后 4 个字节。因此它们可能不适合某些用途。” (谢谢,Grawity,我应该在手册页中发现这一点。)
如果你不想依赖其他可执行文件,或者你不能使用它们,这里是纯 bash版本:
我发现这个脚本“单行”在 uuidgen 不可用的情况下很有用。这也绕过了为 Perl 或 Python 安装外部模块的任何必要性。
在 SnowLeopard、Red Hat Valhalla、Solaris 9 4/04 和更高版本上成功测试。我很好奇这是否容易出现非唯一性,但在过去的 10 年里我并没有被“咬过”。当然
head -1
也可以换成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
。就这样python不会感到被遗忘:
要在 shell 中使用它:
有关可以生成的 UUID 种类,请参阅Python 文档 UUID 。
要在非 systemd 机器上生成 systemd machine-id 兼容文件,您可以使用 python 这样做:
Perl 提供了一个基于
e2fsprogs
包的 UUID 库。在我的 Debian 系统上,它是libuuid-perl
软件包。这是一个示例单线;查看man uuid
更多:这将是微不足道的添加到带有反引号或
$()
符号的 shellscript:为我工作,然后我确实跑了
uuid
我使用 Python 编写了一个小 Bash 函数来批量生成任意数量的 UUID:
如果您更喜欢小写,请更改:
至:
请查看 OSSP UUID 库 ( http://www.ossp.org/pkg/lib/uuid/ ),并考虑安装它。一些项目提供它作为一个选项(例如 PostgreSQL)。 它可以正确处理版本 3 和版本 5 UUID,这超出了我安装的(例如 e2fsprogs)库可以处理的范围。幸运的是,openSUSE 在其中一个主要存储库中有它。让一个版本与 Windows(例如 Cygwin)或 MySQL 一起工作一直很困难。看起来是时候切换到 Linux/PostgreSQL/Python(我非常喜欢 SQLyog GUI 到 MySQL/MariaDB),因为我真的需要 v3 和 v5 UUID。