2016-07-16 5 views
3

Я пытаюсь проверить, является ли строка $uuid UUID. Я написал этот скрипт, но по какой-то причине он не работает:Проверьте, является ли строка UUID bash

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 
+0

Вы сделали ошибку в своем регулярном выражении. См. Мой недавно отредактированный ответ. –

ответ

5

Ваше регулярное выражение не принимает строчные буквы как действительные. Вот фиксированная версия:

#!/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, а не нижний регистр, который у вас есть. По этим причинам ваши классы [A-Z0-9] были заменены на [A-F0-9a-f].

См. Сообщение от Ekeyme Mo для соображений безопасности.

+0

У меня уже есть! – maxisme

+2

Цифры должны быть шестнадцатеричными цифрами; используйте '[A-Fa-f0-9]' или лучше, '[[: xdigit:]]'. – chepner

+0

@chepner Это хороший момент. Я отредактировал свой пост, чтобы отразить изменения. –

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 
+0

более безопасный -> безопаснее (грамматическая деталь). Но в общем случае экранирование будет происходить в любом случае, когда используется '$ pattern', например. если вы используете его внутри backticks. В любом случае +1 для цитирования '$ uuid', всегда указывайте переменные, чтобы быть в безопасности. – grochmal

+0

Если я выполняю этот скрипт, он возвращает «false». Я использую bash 4.3.46 для linux. – orzel

4

Дефис не означает ничего; 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 
+0

Работы. Вероятно, стоит цитировать $ {uuid // - /}, не так ли? – orzel

+1

Внутри '[[...]]', разложения параметров не подлежат разрыву слов или расширению пути, что является двумя причинами их цитирования. – chepner

+0

Арг, я всегда забываю об этом, ты прав! – orzel