Как проверить входную строку в bash, она в формате версии (n1.n2.n3) - PullRequest
5 голосов
/ 13 февраля 2012

Я написал скрипт, который обновляет версию определенного файла. Мне нужно проверить, что ввод для пользователя в формате версии, поэтому я не заканчиваю добавлять числа, которые не нужны в этих важных файлах. Я сделал это, добавив новое значение version_check, где я удаляю свой шаблон регулярных выражений, а затем проверяю if.

version=$1
version_checked=$(echo $version | sed -e '/[0-9]\+\.[0-9]\+\.[0-9]/d')

if [[ -z $version_checked ]]; then
    echo "$version is the right format"
else
    echo "$version_checked is not  in the right format, please use XX.XX.XX format (ie: 4.15.3)"
    exit
fi

Это прекрасно работает для XX.XX и XX.XX.XX, но также допускает XX.XX.XX.XX и XX.XX.XX.XX.XX и т. Д., Поэтому, если пользователь допустит ошибку, он введет неправильный ввод данные в файле. Как я могу заставить регулярное выражение sed разрешить ТОЛЬКО 3 пары чисел, разделенных точкой?

Ответы [ 2 ]

4 голосов
/ 13 февраля 2012

Измените свое регулярное выражение с:

/[0-9]\+\.[0-9]\+\.[0-9]/

на это:

/^[0-9]*\.[0-9]*\.[0-9]*$/
0 голосов
/ 13 февраля 2012

Вы можете сделать это с помощью bash сопоставления с образцом :

$ for version in 1.2 1.2.3 1.2.3.4; do
    printf "%s\t" $version
    [[ $version == +([0-9]).+([0-9]).+([0-9]) ]] && echo y || echo n
done

1.2     n
1.2.3   y
1.2.3.4 n

Если вам нужно, чтобы каждая группа цифр была точно 2 цифрами:

[[ $version == [0-9][0-9].[0-9][0-9].[0-9][0-9] ]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...