bash регулярное выражение для соответствия номеру семантической версии
У меня есть следующее:
versionNumber=$(sw_vers -productVersion) # Finds version number
versionShort=${versionNumber:0:4} # Cut string to 1 decimal place for calculation
который работает, когда версии похожи на это:
10.9.2
10.9.5
но это не будет соответствовать
10.10.3
как вернется только
10.1
но я хочу, чтобы versionShort был установлен на
10.10
Я хочу соответствовать основной версии, первой точке и вспомогательной версии, как указано выше.
4 ответа
Решение без регулярных выражений - отрежьте последнюю точку и все, что следует за ней:
versionShort=${versionNumber%.*}
Решение регулярных выражений:
[[ $versionNumber =~ ^[0-9]+\.[0-9]+ ]] && echo "${BASH_REMATCH[0]}"
Он всегда будет печатать первые два числа, например, все эти:
10.5
10.5.9
10.5.8.2
Приведет к 10.5
выход. Вы также можете добавить else
пункт, чтобы проверить, если что-то случилось (совпадение не найдено).
Вот более длинная версия:
if [[ $versionNumber =~ ^[0-9]+\.[0-9]+ ]]; then
versionShort=${BASH_REMATCH[0]}
else
echo "Something is wrong with your version" >&2
fi
У меня был похожий вопрос, но мне нужен был доступ ко всем 3 сегментам. Я провел небольшое исследование и тестирование и нашел, что это хорошо работает
product_version=$(sw_vers -productVersion)
semver=( ${product_version//./ } )
major="${semver[0]}"
minor="${semver[1]}"
patch="${semver[2]}"
echo "${major}.${minor}.${patch}"
Чтобы ответить на этот вопрос напрямую, вы могли бы
product_version=$(sw_vers -productVersion)
semver=( ${product_version//./ } )
major="${semver[0]}"
minor="${semver[1]}"
patch="${semver[2]}"
versionShort="${major}.${minor}"
или вы можете использовать меньше переменных
product_version=$(sw_vers -productVersion)
semver=( ${product_version//./ } )
versionShort="${semver[0]}.${semver[1]}"
https://github.com/fsaintjacques/semver-tool https://github.com/fsaintjacques/semver-tool/blob/master/src/semver
SEMVER_REGEX="^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(\\-[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$"
function validate-version {
local version=$1
if [[ "$version" =~ $SEMVER_REGEX ]]; then
# if a second argument is passed, store the result in var named by $2
if [ "$#" -eq "2" ]; then
local major=${BASH_REMATCH[1]}
local minor=${BASH_REMATCH[2]}
local patch=${BASH_REMATCH[3]}
local prere=${BASH_REMATCH[4]}
local build=${BASH_REMATCH[5]}
eval "$2=(\"$major\" \"$minor\" \"$patch\" \"$prere\" \"$build\")"
else
echo "$version"
fi
else
error "version $version does not match the semver scheme 'X.Y.Z(-PRERELEASE)(+BUILD)'. See help for more information."
fi
}