apropriadamente usando o $ atom em uma substituição de parâmetro

1

Estou tentando executar uma substituição de parâmetro que retira tudo, desde o primeiro caractere - até o final de uma string assim: v0.1-bla-hblah-232 -> v0.1

Estou usando o seguinte script:

#!/usr/bin/env bash
project_version=$(git describe --tags --long)
clean_version=${project_version%-$}
echo "$project_version"
echo "$clean_version"

Se eu executar isso, não funcionará:

test λ ./revisioncount.sh
v0.1-2-g2ff1e73
v0.1-2-g2ff1e73

Parece que o $ átomo não está sendo captado pelo bash. backslashing não funciona: \$ .

Agora, se eu mudar a linha de substituição para isso:

clean_version=${project_version%%-*}

Então funciona:

test λ ./revisioncount.sh
v0.1-2-g2ff1e73
v0.1

Como posso usar o $ (que corresponde ao final da string) para obter o efeito desejado?

    
por ninrod 28.12.2016 / 14:12

2 respostas

4
clean_version=${project_version%%-*}

é a coisa correta para usar como você descobriu.

% e %% correspondem no end por definição, por isso não há necessidade de uma âncora como $ dizer correspondência no final.

Para referência # e ## correspondem no início.

O caso interessante é a expansão / , que corresponde a qualquer lugar por padrão. Aqui, o caractere primeiro sendo # ou % força o padrão a corresponder no início ou no final.

    
por 28.12.2016 / 14:38
1

O idioma bash ${var%%pattern} usa um padrão, não uma expressão regular.

Em um padrão, um .* significa algo diferente do seu "nada" pretendido.
Na verdade, um simples * corresponde a uma execução de qualquer caractere em um padrão.

Além disso, o tipo de correspondência % é (por sua própria natureza) delimitado por $ .

Então, isso:

echo ${project_version%%-*}

Corresponde a correspondência mais longa ( %% em vez de % ) de um traço ( - ) seguido por uma execução de qualquer caractere até o final da string dentro de project_version .

A atribuição correta será:

clean_version=${project_version%%-*}
    
por 28.12.2016 / 22:09