检查字符串是否为 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

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

#!/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的帖子。

连字符实际上没有任何意义; 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

在 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

相关内容

  • 没有找到相关文章

最新更新