AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 103359
Accepted
raoulsson
raoulsson
Asked: 2010-01-17 05:41:43 +0800 CST2010-01-17 05:41:43 +0800 CST 2010-01-17 05:41:43 +0800 CST

如何在 bash 中创建 UUID?

  • 772
锁定。这个问题及其答案被锁定,因为这个问题离题但具有历史意义。它目前不接受新的答案或交互。

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

UUID uuid = UUID.randomUUID();

如何在 Bash 中做到这一点?

bash uuid
  • 14 14 个回答
  • 266494 Views

14 个回答

  • Voted
  1. Best Answer
    Dennis Williamson
    2010-01-17T06:01:51+08:002010-01-17T06:01:51+08:00

    请参阅作为e2fsprogs软件包uuidgen一部分的程序。

    据此,现在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,,} ]]
    
    • 224
  2. Samveen
    2013-08-08T04:55:02+08:002013-08-08T04:55:02+08:00

    要在不添加外部依赖项的情况下添加多样性,在Linux上,您可以执行以下操作:

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

    为了传播不良做法,在FreeBSD上,在 linux 兼容层(linuxulator?)下,

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

    参考:

    • 维基百科上的 UUID。
    • FreeBSD 错误 #186187 - [linprocfs] [patch] 模拟 /proc/sys/kernel/random/uuid
    • 167
  3. quack quixote
    2010-01-17T06:18:57+08:002010-01-17T06:18:57+08:00

    只是为了完整起见......dbus在Debian上还安装了一个UUID生成器。我错过了它早些时候环顾四周。它可能与 e2fsprogs 包的算法相同,但它不添加破折号,所以它可能对你来说更干净一点:

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

    Grawity 添加了一个安全提示:“DBus UUID 与RFC 4122无关或不兼容。此外,dbus-uuidgen始终使用 Unix 时间戳作为最后 4 个字节。因此它们可能不适合某些用途。” (谢谢,Grawity,我应该在手册页中发现这一点。)

    • 34
  4. noway
    2014-05-22T13:12:54+08:002014-05-22T13:12:54+08:00

    如果你不想依赖其他可执行文件,或者你不能使用它们,这里是纯 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
    
    • 20
  5. dan
    2016-08-26T15:57:42+08:002016-08-26T15:57:42+08:00

    我发现这个脚本“单行”在 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也可以换成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
    
    • 19
  6. gm3dmo
    2010-01-17T07:26:43+08:002010-01-17T07:26:43+08:00

    就这样python不会感到被遗忘:

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

    要在 shell 中使用它:

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

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

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

    python -c 'import re; import uuid; print re.sub("-","",str(uuid.uuid4()))' \
     > /etc/machine-id
    
    • 14
  7. quack quixote
    2010-01-17T05:54:30+08:002010-01-17T05:54:30+08:00

    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
    
    • 11
  8. Joseph
    2013-06-20T01:07:13+08:002013-06-20T01:07:13+08:00
    apt-get install uuid
    

    为我工作,然后我确实跑了uuid

    • 3
  9. Will
    2015-08-04T14:16:00+08:002015-08-04T14:16:00+08:00

    我使用 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"')]))'
    
    • 1
  10. user2351170
    2015-09-24T15:37:25+08:002015-09-24T15:37:25+08:00

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

    • 1

相关问题

  • Mac OS X:从 python 脚本中更改 $PATH

  • Bash 脚本:要求脚本以 root 身份运行(或使用 sudo)

  • crontab ifconfig 什么都不输出

  • 使用命令行工具按排序顺序计算重复项

  • 是否有 bash 等效于 ruby​​ 的“一些内容#{foo}”?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve