检查字符串是否为UUID

max*_*sme 8 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
Run Code Online (Sandbox Code Playgroud)

Spe*_*uex 7

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

#!/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
Run Code Online (Sandbox Code Playgroud)

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

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

有关安全考虑,请参阅Ekeyme Mo的文章.


che*_*ner 7

连字符并不意味着什么; 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
Run Code Online (Sandbox Code Playgroud)

  • 在 `[[...]]` 内部,参数扩展不受分词或路径名扩展的影响,这是引用它们的两个原因。 (2认同)

Eke*_* Mo 6

将模式预先保存到 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
Run Code Online (Sandbox Code Playgroud)

  • 更安全 -> 更安全(语法细节)。但一般来说,当使用“$pattern”时,无论如何都会发生转义,例如,如果您在反引号内使用它。无论如何,+1 引用`$uuid`,总是引用变量以确保安全。 (3认同)