인프런 커뮤니티 질문&답변

왈왈님의 프로필 이미지
왈왈

작성한 질문수

리눅스 쉘 스크립트 마스터

${object%%:*}, ${object#*:}는 어떤 뜻인가요

해결된 질문

작성

·

203

2

안녕하세요.

"배열과 glob 그리고 루프문" 강의를 듣고 실습중인데

아래 KEY와 VALUE 쪽에 ${object%%:*}, ${object#*:} 여기서 쓰인 기호들 뜻이 궁금합니다

root@eb0201ac5fe0:/home/test# ARRAY=( "sky:blue" "snow:white" "night:black")
root@eb0201ac5fe0:/home/test#
root@eb0201ac5fe0:/home/test# for object in "${ARRAY[@]}" ; do
>     KEY=${object%%:*}
>     VALUE=${object#*:}
>     printf "%s's color is %s.\n" "$KEY" "$VALUE"
> done
sky's color is blue.
snow's color is white.
night's color is black.
root@eb0201ac5fe0:/home/test#

 

답변 1

1

홍영기님의 프로필 이미지
홍영기
지식공유자

안녕하세요. 왈왈님!

궁금하신 내용에 대하여 답변드립니다.

KEY=${object%:*} 혹은 KEY=${object%%:*}

이 구문은 object의 문자열에서 :을 기준으로 앞 부분만 추출합니다. ${variable%%pattern}은 variable에서 가장 오른쪽에 있는 pattern 앞의 모든 문자열을 반환합니다. 따라서 이 구문은 object에서 : 앞의 부분만 KEY에 저장합니다.

(예) VAR="sky:blue" 여기서 sky 만 남기고 싶다면 이렇게 하면 됩니다. echo ${VAR%:*} . 실행결과는 sky

여기서 % 와 %% 는 차이가 있는데요.

% 은 오른쪽의 가장 짧게 일치하는 패턴을 제거합니다.

%% 은 오른쪽의 가장 길게 일치하는 패턴을 제거합니다.

예를들어

admin👻 VAR="sky:blue:blue"

admin👻 echo ${VAR%%:*}

sky

admin👻 echo ${VAR%:*}

sky:blue

 

VALUE=${object#*:} 혹은 VALUE=${object##*:}

이 구문은 object의 문자열에서 :을 기준으로 뒷 부분만 추출합니다. ${variable#pattern}은 variable에서 가장 왼쪽에 있는 pattern 뒤의 모든 문자열을 반환합니다. 따라서 이 구문은 object에서 : 뒤의 부분만 VALUE에 저장합니다.

(예) VAR="sky:blue" 여기서 blue 만 남기고 싶다면 이렇게 하면 됩니다. echo ${VAR#*:} . 실행결과는 sky

여기서도 # 와 ## 는 차이가 있는데요

# 은 왼쪽의 가장 짧게 일치하는 패턴을 제거합니다.

## 은 왼쪽의 가장 길게 일치하는 패턴을 제거합니다.

예를들어

admin👻 VAR="sky:blue:blue"

admin👻 echo ${VAR##*:}

blue

admin👻 echo ${VAR#*:}

blue:blue

 

이와 관련 강의 영상 매개변수 확장(PE) 입니다. 참고해주세요

 

왈왈님의 프로필 이미지
왈왈
질문자

정성스러운 설명 너무 감사드립니다.

해당 강의 다시 한번 봐야겠습니다.
강의 항상 잘 보고 있습니다. 좋은 하루 되세요!

왈왈님의 프로필 이미지
왈왈

작성한 질문수

질문하기