检查字符串是否为UUID

时间:2016-07-16 23:38:17

标签: bash shell uuid

我正在尝试测试字符串$uuid是否为UUID。我写过这个剧本,但由于某种原因它不起作用:

uuid="7632f5ab-4bac-11e6-bcb7-0cc47a6c4dbd"
if [[ $uuid =~ ^\{?[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}\}?$ ]]; then
    echo "true"
else
    echo "false"
fi

3 个答案:

答案 0 :(得分:6)

您的正则表达式不接受小写字母为有效。这是一个固定版本:

#!/bin/bash
uuid="7632f5ab-4bac-11e6-bcb7-0cc47a6c4dbd"
if [[ $uuid =~ ^\{?[A-F0-9a-f]{8}-[A-F0-9a-f]{4}-[A-F0-9a-f]{4}-[A-F0-9a-f]{4}-[A-F0-9a-f]{12}\}?$ ]]; then
    echo "true"
else
    echo "false"
fi

首先,您只需要搜索A-F而不是A-Z,因为UUID包含十六进制数字。

注意在每个字符类中添加a-f。您的版本将拒绝以小写字母打印的任何UUID。这个新版本现在适用于我。另一种解决方案是仅使用大写的UUID,而不是您使用的小写UUID。由于这些原因,您的[A-Z0-9]课程已被[A-F0-9a-f]取代。

出于安全考虑,请参阅Ekeyme Mo的帖子。

答案 1 :(得分:6)

连字符并不意味着什么; UUID只是一个128位的值,传统的显示器使用8-4-4-4-12分组,但这不是所需的。这意味着只要您在删除-后有32位十六进制数字,它就是一个UUID。

uuid="7632f5ab-4bac-11e6-bcb7-0cc47a6c4dbd"
if [[ ${uuid//-/} =~ ^[[:xdigit:]]{32}$ ]]; then
    echo "true"
else
    echo "false"
fi

答案 2 :(得分:2)

将模式预先保存到bash =~子句中的变量中更安全,以避免在bash中出现不可预测的转义。

uuid="7632f5ab-4bac-11e6-bcb7-0cc47a6c4dbd"
pattern='^\{?[A-Z0-9a-z]{8}-[A-Z0-9a-z]{4}-[A-Z0-9a-z]{4}-[A-Z0-9a-z]{4}-[A-Z0-9a-z]{12}\}?$'

if [[ "$uuid" =~ $pattern ]]; then
    echo "true" 
else
    echo "false" 
fi