Answers:
见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,,} ]]
echo -e 'f\nF' | grep '[[:xdigit:]]'
输出两行)。如果对您而言确实很重要,并且您拥有Bash 4,则可以执行以下操作以使其小写:uuid=$(uuidgen); uuid=${uuid,,}
或使其变为大写:uuid=$(uuidgen); uuid=${uuid^^}
或按照以下方式进行tolower()
样式测试:if [[ ${uuid1,,} == ${uuid2,,} ]]
要添加种类而不添加外部依赖项,在Linux上,您可以执行以下操作:
UUID=$(cat /proc/sys/kernel/random/uuid)
为了传播不良行为,请在FreeBSD的linux兼容层(linuxulator?)下,
UUID=$(cat /compat/linux/proc/sys/kernel/random/uuid)
参考文献:
只是为了完整起见... dbus
Debian 上还安装了一个UUID生成器。我很早就错过了它。它可能与e2fsprogs软件包使用相同的算法,但是它没有添加破折号,因此对您来说可能更干净一些:
$ uuidgen
387ee6b9-520d-4c51-a9e4-6eb2ef15887d
$ dbus-uuidgen
d17b671f98fced5649a856a54b51c9e6
Grawity增加了一个安全提示:“ DBus UUID与RFC 4122不相关或不兼容。此外,dbus-uuidgen始终使用Unix时间戳作为最后4个字节。因此,它们可能不适用于某些用途。” (谢谢,Grawity,我应该在联机帮助页中发现了这一点。)
dbus-uuidgen
始终使用Unix时间戳作为最后4个字节。因此,它们可能不适用于某些用途。
如果你不希望依赖于其他可执行文件,也可以不使用它们,这里是从纯bash的版本在这里:
# 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
T
可以消除该变量,并且可以将for T
循环更改为:(case $N in 3 | 5 | 7 | 9) printf '-';; esac
如果需要,可以在单独的行中分解)。
case
用于消除if
语句以及内部for
语句的版本。它使代码更加整洁。请注意,两者B%15
都应为B%16
和B%255
应该为B%256
。
source <(curl url)
或进行其他操作
在没有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及更高版本上进行了成功测试。我很想知道这是否容易造成非唯一性,但是我在过去的十年中没有被“咬”过。当然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
。
993bb8d7-323d-b5ee-db78-f976a59d8284
od -x /dev/urandom | head -1 | awk '{OFS="-"; srand($6); sub(/./,"4",$5); sub(/./,substr("89ab",rand()*4,1),$6); print $2$3,$4,$5,$6,$7$8$9}'
只是这样,python不会感到被遗忘:
python -c 'import uuid; print uuid.uuid1()'
2d96768e-02b3-11df-bec2-001e68b9d147
在外壳中使用它:
myvar=$(python -c 'import uuid; print uuid.uuid1()')
有关可以生成的UUIDS的类型,请参见Python文档UUID。
要在非系统机器上生成与系统机器ID兼容的文件,可以使用python这样做:
python -c 'import re; import uuid; print re.sub("-","",str(uuid.uuid4()))' \
> /etc/machine-id
python3 -c "import uuid; print(uuid.uuid4())"
的python3
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
将其添加到带有反引号或$()
符号的shellscript中将是微不足道的:
#!/bin/bash
# ...do some stuff
$myvar = $(perl -e 'use UUID; UUID::generate($uuid); UUID::unparse($uuid, $string); print "$string";')
# ...do some more stuff
我使用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。
-v3 ns:URL custom-data
种子机制支持命名空间。
我确定有些人会到达这里,只是在寻找一种简单的方法来生成用于其脚本的唯一ID,而不必是真正的UUID。
如果是这样,您可以执行以下操作,这将生成一个唯一的ID,直到秒为止。-因此,如果在一秒钟内多次运行此ID,您仍将获得相同的结果。
MYID="U$(date +%s)"
echo $MYID
将根据当前系统时间生成如下所示的ID:
U1454423662
注意:如果您使用的是Linux,或者在Mac上安装了Coreutils,则可以使用以下代码生成纳秒级的唯一ID:
MYID="U$(date +%s%N)"
echo $MYID
或者,如果您希望使用基于python的解决方案,该解决方案几乎可以在任何地方都可以工作,请运行以下命令:
MYUID=U$(python -c'import time; print repr(time.time())')
echo $MYUID
mktemp -u
如MYID="$(mktemp -u)"
。如果您有足够的时间放置空的临时文件直到重新启动,请删除-u
:MYID="$(mktemp)"
ran=`od -X -A n /dev/random | head -1 | cut -c3-38`
correlation_id=`echo ${ran} | cut -c1-8`-`echo ${ran} | cut -c10-13`-`echo ${ran} | cut -c14-17`-`echo ${ran} | cut -c19-22`-`echo ${ran} | cut -c23-26``echo ${ran} | cut -c28-35`
od -X -A n /dev/random | head -1 | cut -c3-38
给你这个回声低于$ X 4151540a 1f7d0bef 8a0725fb d26183a3 UUID = echo ${x} | cut -c1-8
- echo ${x} | cut -c10-13
- echo ${x} | cut -c14-17
- echo ${x} | cut -c19-22
- echo ${x} | cut -c23-26``echo ${x} | cut -c28-35
回声$ UUID 4151540a-1f7d0bef-8a07-25fbd26183a3
如果您使用的是Java 10。
$ jshell
jshell> import java.util.*
jshell> String id = UUID.randomUUID().toString();
jshell
可以在bash脚本中使用而 不是作为交互式命令的示例。这在原始帖子中非常清楚。
echo "System.out.println(java.util.UUID.randomUUID().toString())" | /Library/Java/JavaVirtualMachines/openjdk-11.0.1.jdk/Contents/Home/bin/jshell -s | grep -v ">"
但是它比花费了更长的时间uuidgen
。
uuid-runtime
毫无理由地将其