VERSION="4.0beta12"
NEXT_VERSION=?????
자동 릴리스 스크립트를 작성하면서 현재 버전을 $VERSION 변수에 저장하고 다음 버전을 $NEXT_VERSION으로 계산하려고 합니다.
규칙: 문자열 끝의 정수를 증가시키세요.
4.0베타12 → 4.0베타13
4.2알파9 → 4.2알파10
sed/awk/eval을 시도했지만 제대로 작동하지 않습니다. 아이디어가 있나요? 어떤 도구라도 가능합니다.
답변1
Bash 외에는 아무것도 필요하지 않습니다.
for version in 12.4alpha9 12.4alpha12 12.4alpha-2; do
echo -n "$version => ";
[[ "$version" =~ (.*[^0-9])([0-9]+)$ ]] && version="${BASH_REMATCH[1]}$((${BASH_REMATCH[2]} + 1))";
echo "$version";
done
당신과 실제로 관련된 유일한 줄은 정규식 검사가 포함된 줄입니다 [[
. 이 줄은 최종 숫자까지 이어지는 모든 것을 기억하고 이를 재사용하고 다음 숫자를 추가합니다.
답변2
항상 합리적으로 잘 구성된 규칙이 있다고 가정하면(버전에는 항상 숫자가 없고 버전은 항상 숫자로 끝납니다) 다루기 힘들기는 하지만 이것이 시작일 수 있습니다.
#!/usr/bin/gawk -f
1 {
pfx = gensub(/^(.*[^0-9])([0-9]+)$/, "\\1", "")
patchlevel = gensub(/^(.*[^0-9])([0-9]+)$/, "\\2", "")
new_pl = (1*patchlevel)+1
printf "%s%s\n", pfx, new_pl
}
시험:
[0 1066] ~/temp % echo "12.4alpha9" | gawk -f incvers.awk
12.4alpha10
[0 1067] ~/temp % echo "12.4alpha12" | gawk -f incvers.awk
12.4alpha13
[0 1068] ~/temp % echo "12.4alpha-2" | gawk -f incvers.awk
12.4alpha-3
답변3
가지려고 노력하다
MAJOR=4
MINOR=0
STATE="beta"
POINT=9
VERSION=$MAJOR.$MINOR$STATE$POINT
NEXT_VERSION=$MAJOR.$MINOR$STATE$((POINT +1 ))
echo "Next version is $NEXT_VERSION"
# other release stuff here
이것이 자체 재작성 스크립트가 되기를 원하십니까? 나는 다음과 같은 것을 제안 할 것입니다
tempfile=$( tempfile -d . )
sed -re "s/POINT=[0-9]+/POINT=$(( ++POINT ))/" $0 > $tempfile
chmod +x $tempfile
mv $tempfile $0
답변4
이것은 1 끝에 있는 숫자에 1을 더하는 이식 가능한 쉘 조각입니다 $current_version
.
n=${current_version##*[!0-9]}; p=${current_version%%$n}
next_version=$p$((n+1))
단순하다고 해서(아주 간단하다) 좋은 아이디어라는 뜻은 아닙니다. 좋다앤드류, 변수 정의를 구성 요소로 나누는 것이 좋습니다.