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
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
3条答案
按热度按时间yebdmbv41#
您的正则表达式不接受有效的小写字母。下面是一个固定版本:
首先,您只需要搜索
A-F
而不是A-Z
,因为UUID包含十六进制数字。请注意,在每个字符类中添加了
a-f
。您的版本将拒绝任何以小写字母打印的UUID。这个新版本现在对我来说很好用。另一种解决方案是只使用大写UUID,而不是您拥有的小写UUID。由于这些原因,您的[A-Z0-9]
类已被替换为[A-F0-9a-f]
。请参阅Ekeyme Mo的帖子以了解安全注意事项。
5ssjco0h2#
连字符并不意味着什么UUID只是一个128位的值,传统的显示器使用8-4-4-4-12分组,但这不是必需的。这意味着只要删除
-
后有32个十六进制数字,它就是UUID。f3temu5u3#
更安全的做法是将模式预先保存到bash
=~
子句中的变量中,以避免bash中不可预测的转义。