다음과 같은 변수를 정의한다고 가정해 보겠습니다.
number=123#456
앞에 "123#" 없이 인쇄하고 싶습니다. (이것은 zsh에서 10이 아닌 숫자를 처리할 때 발생합니다.)"파라미터 확장"설명서의 일부에는 다음과 같이 나와 있습니다.
${name#pattern}
${name##pattern}
패턴이 값의 시작 부분과 일치하는 경우이름을 선택한 다음 값을 대체합니다.이름일치하는 부분을 제거하고 그렇지 않으면 다음으로 교체하십시오.이름. 첫 번째 형식에서는 가장 작은 일치 패턴이 선호되고, 두 번째 형식에서는 가장 큰 일치 패턴이 선호됩니다.
이것이 나에게 의미하는 바는 내가 다음과 같이 말할 수 있어야 한다는 것입니다.
print ${number#123#}
"123#"을 제거하면 실제로는 "3#456"이 출력됩니다. 제거하려는 "#"을 이스케이프 처리하면 원하는 효과를 얻을 수 있다는 것을 알았습니다.
print ${number#123\#} # prints "456"
이스케이프 처리하기 전에 "#"에 특별한 의미가 있나요?
답변1
#
는글로벌 운영자이는 "앞의 문자 또는 대괄호 그룹이 0번 이상 발생함"을 의미합니다. 이것은 정규식 연산자를 작성하는 zsh 방식입니다 *
. 따라서 가장 짧은 일치 항목이 선택될 때 일치가 시작되고( ) 123#
가장 긴 일치 항목이 선택될 때 일치가 시작됩니다( ).12
123#456
${number#123#}
123
${number##123#}
운영자는 #
다음과 같은 경우에만 활성화됩니다.extended_glob
옵션이 설정되었습니다. 이 옵션은 기본적으로 설정되어 있지는 않으나 보통 환경설정에서 설정(매우 유용하고 기본적으로 귀찮지 않기 때문에)되며, 완성 기능이 실행될 때 항상 설정된다.