Incrementar o número na sequência de variáveis do bash

4
VERSION="4.0beta12"
NEXT_VERSION=?????

Escrevendo um script de lançamento automático, tenho a versão atual em uma variável $ VERSION e gostaria de calcular a próxima versão como $ NEXT_VERSION.

Regra: Incrementar o inteiro no final da string.
4.0beta12 → 4.0beta13
4.2alfa9 → 4.2alfa10

Eu tentei com sed / awk / eval mas não consigo fazer funcionar. Idéias? Qualquer ferramenta está bem.

    
por Nicolas Raoul 24.10.2011 / 06:43

4 respostas

5

Supondo que você sempre tenha algumas regras razoáveis de boa formação (sempre um não-dígito na versão, a versão sempre termina em dígitos), isso, no entanto, klunky, pode ser um começo:

#!/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
}

Teste:

[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
    
por 24.10.2011 / 07:40
5

Não há necessidade de nada além de 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

A única linha realmente relevante para você, é aquela com a verificação de regex [[ : ela lembra de tudo que leva ao número final, reutiliza e acrescenta o próximo número.

    
por 24.10.2011 / 11:31
3

Tente ter

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 

Deseja que isso seja um script de auto-reescrita? Eu sugeriria algo como

tempfile=$( tempfile -d . )
sed -re "s/POINT=[0-9]+/POINT=$(( ++POINT ))/" $0 > $tempfile
chmod +x $tempfile
mv $tempfile $0
    
por 24.10.2011 / 07:59
2

Aqui está um snippet de shell portátil que adiciona 1 ao número no final de $current_version .

n=${current_version##*[!0-9]}; p=${current_version%%$n}
next_version=$p$((n+1))

Só porque é simples (bem simples) não significa que seja uma boa ideia. Assim como o Andrew , recomendo detalhar suas definições de variáveis em componentes.

    
por 25.10.2011 / 02:27