해결된 질문
작성
·
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) 입니다. 참고해주세요
정성스러운 설명 너무 감사드립니다.
해당 강의 다시 한번 봐야겠습니다.
강의 항상 잘 보고 있습니다. 좋은 하루 되세요!