매개변수 대체 시 $atom의 올바른 사용

매개변수 대체 시 $atom의 올바른 사용

다음과 같이 첫 번째 문자부터 문자열 끝까지 -모든 항목을 제거하여 매개변수 대체를 수행하려고 합니다.v0.1-bla-hblah-232 -> v0.1

그래서 다음 스크립트를 사용합니다.

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

이것을 실행하면 작동하지 않습니다.

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

$bash가 원자를 선택하지 않는 것 같습니다 . 백슬래시도 작동하지 않습니다: \$.

이제 대체 줄을 다음과 같이 변경하면:

clean_version=${project_version%%-*}

그러면 작동합니다:

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

$원하는 효과를 얻으려면 (문자열 끝 일치)를 어떻게 사용합니까 ?

답변1

clean_version=${project_version%%-*}

당신이 발견했듯이 이것이 올바른 사용 방법입니다.

%그리고 %%일치$정의에 따르면 끝에 "일치"와 같은 앵커 가 필요하지 않습니다 .

#처음에 참고하고 매칭하기 위해 .##

흥미로운 사례는 /기본적으로 모든 곳에서 일치하는 확장입니다. 여기첫 번째문자는 패턴이 시작이나 끝에서 일치하도록 강제합니다 #.%

답변2

bash 관용구는 ${var%%pattern}정규식이 아닌 패턴을 사용합니다.

패턴에서 a는 .*원하는 "모든 것"과 다른 것을 의미합니다.
실제로 simple은 *패턴의 모든 문자와 일치합니다.

또한 %일치 유형(자체 특성에 따라)은 $.

그래서 이거:

echo ${project_version%%-*}

가장 긴 일치 항목과 일치합니다( 대시( )가 %%아니고 그 뒤에 내부 문자열 끝까지의 모든 문자가 옵니다 ).%-project_version

그러면 올바른 할당은 다음과 같습니다.

clean_version=${project_version%%-*}

관련 정보