检查字符串是否为 UUID
Check if string is 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 包含十六进制数字。
注意每个字符 class 中添加了 a-f
。您的版本将拒绝任何以小写字母打印的 UUID。这个新版本现在对我来说很好用。另一种解决方案是仅使用大写 UUID,而不是您拥有的小写 UUID。由于这些原因,您的 [A-Z0-9]
classes 已被替换为 [A-F0-9a-f]
。
出于安全考虑,请参阅 Ekeyme Mo 的 post。
将模式预先保存到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
连字符实际上没有任何意义; 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
我正在尝试测试一个字符串 $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 包含十六进制数字。
注意每个字符 class 中添加了 a-f
。您的版本将拒绝任何以小写字母打印的 UUID。这个新版本现在对我来说很好用。另一种解决方案是仅使用大写 UUID,而不是您拥有的小写 UUID。由于这些原因,您的 [A-Z0-9]
classes 已被替换为 [A-F0-9a-f]
。
出于安全考虑,请参阅 Ekeyme Mo 的 post。
将模式预先保存到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
连字符实际上没有任何意义; 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