Bash 변수 문자열의 증가

Bash 변수 문자열의 증가
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))

단순하다고 해서(아주 간단하다) 좋은 아이디어라는 뜻은 아닙니다. 좋다앤드류, 변수 정의를 구성 요소로 나누는 것이 좋습니다.

관련 정보