如何在bash中创build一个UUID?

在Java中,可以创build一个随机的UUID :

UUID uuid = UUID.randomUUID(); 

如何在Bash中做到这一点?

请参阅uuidgen程序,该程序是e2fsprogs软件包的一部分。

据此, libuuid现在是util-linux的一部分,e2fsprogs中的内容正在被淘汰。 但是,在新的Ubuntu系统上, uuidgen现在位于uuid-runtime软件包中。

要创build一个uuid并将其保存在一个variables中:

 uuid=$(uuidgen) 

在我的Ubuntu系统上,字母字符以小写forms输出,在我的OS X系统上,它们以大写forms输出(感谢David在注释中指出了这一点)。

要切换为全部大写(如上所述生成后):

 uuid=${uuid^^} 

切换到全部小写:

 uuid=${uuid,,} 

例如,如果你有两个UUID,并且你想在Bash中比较它们,忽略它们的情况,你可以像这样做一个tolower()风格的比较:

 if [[ ${uuid1,,} == ${uuid2,,} ]] 

要添加多样性而不添加外部依赖关系,可以在Linux上执行:

 UUID=$(cat /proc/sys/kernel/random/uuid) 

为了宣传不好的做法,在FreeBSD上 ,在linux兼容层(linuxulator?)下,

 UUID=$(cat /compat/linux/proc/sys/kernel/random/uuid) 

参考文献:

  • UUID在维基百科上 。
  • FreeBSD Bug#186187 – [linprocfs] [patch]模拟/ proc / sys / kernel / random / uuid

只是为了完整…在Debian上还有一个安装了dbus软件包的UUID生成器。 我错过了它前面环顾四周。 这可能是与e2fsprogs包相同的algorithm,但不会添加破折号,因此它可能会更清晰一些:

 $ uuidgen 387ee6b9-520d-4c51-a9e4-6eb2ef15887d $ dbus-uuidgen d17b671f98fced5649a856a54b51c9e6 

Grawity增加了一个安全提示:“DBus UUID与RFC 4122不相关或兼容,而且dbus-uuidgen总是使用Unix时间戳作为最后4个字节,所以它们可能不适合某些用途。 (谢谢Grawity,我应该在manpage上看到这个)

如果你不想依赖于其他的可执行文件,或者你不能使用它们,这里是纯粹的bash版本:

 # Generate a pseudo UUID uuid() { local NBT 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提供了一个基于e2fsprogs包的UUID库。 在我的Debian系统上,它是libuuid-perl软件包。 这是一个示例单线程; 看到man 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 

使用反引号或$()表示法来添加一个shell脚本是很简单的:

 #!/bin/bash # ...do some stuff $myvar = $(perl -e 'use UUID; UUID::generate($uuid); UUID::unparse($uuid, $string); print "$string";') # ...do some more stuff 

只是如此python不觉得遗漏了:

 python -c 'import uuid; print uuid.uuid1()' 2d96768e-02b3-11df-bec2-001e68b9d147 

要在shell中使用它:

 myvar=$(python -c 'import uuid; print uuid.uuid1()') 

有关可生成的UUIDS的种类,请参阅Python文档UUID 。

要在非systemd机器上生成systemd机器id兼容文件,可以使用python来这样做:

 python -c 'import re; import uuid; print re.sub("-","",str(uuid.uuid4()))' \ > /etc/machine-id 

我发现这个脚本“单行”在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和更新的版本上testing成功。 我很好奇,如果这是非独特的,但在过去的10年里我一直没有“咬”。 当然, head -1可以replace为head -_other-value_ | tail -1 head -_other-value_ | tail -1也。

解释,

/dev/random/dev/urandom是内核随机生成器。

od (八进制转储)有一个hex输出开关(-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 
 apt-get install uuid 

为我工作,然后id运行uuid

我用Python编写了一个Bash函数来生成任意数量的UUID:

 # 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"')]))' 

请查看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。

我相信有些人会到达这里,只是寻找一个简单的方法来生成一个唯一的ID用于他们的脚本,它不需要是一个真正的UUID。

如果是这样,您可以执行以下操作,这将生成一个唯一的ID,因此如果您在一秒钟内多次运行这个ID,您仍然可以得到相同的结果。

 MYID="U$(date +%s)" echo $MYID 

将根据当前系统时间生成类似于以下的ID:

U1454423662

注意:如果你在Linux上,或者在Mac上安装了Coreutils,那么你可以使用下面的代码生成一个唯一的纳秒级的ID:

 MYID="U$(date +%s%N)" echo $MYID 

或者如果你更喜欢基于python的解决scheme,几乎无处不在,可以运行:

 MYUID=U$(python -c'import time; print repr(time.time())') echo $MYUID 

这个线程,它是不同的例子,对我来说真的很有用。 我经常需要来自许多不同环境的uuidfunction。 虽然我喜欢纯粹的bash示例,但使用不同语言的库有时更方便。

所以为了彻底,ruby(1.9.3+)具有内置的SecureRandom模块,其中包含许多有用的散列和id函数。 从bash cli,你可以做到这一点。

 ruby -r securerandom -e 'puts SecureRandom.uuid'