매개변수 확장 모드에서 "#"은 어떤 특별한 의미를 갖나요?

매개변수 확장 모드에서 "#"은 어떤 특별한 의미를 갖나요?

다음과 같은 변수를 정의한다고 가정해 보겠습니다.

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#가장 긴 일치 항목이 선택될 때 일치가 시작됩니다( ).12123#456${number#123#}123${number##123#}

운영자는 #다음과 같은 경우에만 활성화됩니다.extended_glob옵션이 설정되었습니다. 이 옵션은 기본적으로 설정되어 있지는 않으나 보통 환경설정에서 설정(매우 유용하고 기본적으로 귀찮지 않기 때문에)되며, 완성 기능이 실행될 때 항상 설정된다.

관련 정보