다음과 같이 첫 번째 문자부터 문자열 끝까지 -
모든 항목을 제거하여 매개변수 대체를 수행하려고 합니다.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%%-*}