쉘에서 변수 대체에서의 패턴은 조금 특별히 봐야 한다.



패턴 매칭 구문은 하나의 변수 이름(또는 매개 변수 번호)과 하나의 패턴, 두 개의 매개 변수를 받는다. 쉘은 주어진 패턴과 일치하는 주어진 변수의 내용을 검색한다. 패턴이 일치하면 쉘은 커맨드 라인에서 패턴의 일치하는 부분을 삭제한 채 변수 값을 사용한다. 패턴이 일치하지 않으면 커맨드 라인에서 변수의 전체 내용을 사용한다. 두 경우 모두 변수의 내용이 변경되지 않는다.


패턴은 네 가지가 있다.



${variable%pattern}

쉘은 특정 pattern으로 끝나는지 확인하기 위해 내부 variable를 살펴본다. 패턴과 일치하면 variable의 내용이 사용되고 가장 짧게 일치하는 pattern 패턴을 오른쪽부터 제거한다.


예시는 다음과 같다.


[~] s="boys, be ambitious"

[~] echo $s

boys, be ambitious

[~] echo ${s%am*s}

boys, be

[~] echo ${s%b*s}

boys, be am

[~] echo ${s%%b*s}


[~] echo ${s%s}

boys, be ambitiou

[~] echo ${s%i*s}
boys, be ambit


${variable%%pattern}

쉘은 특정 pattern으로 끝나는지 확인하기 위해 variable 내부를 다시 살펴본다. 그러나 이번에는 가장 길게 일치하는 pattern을 오른쪽부터 제거한다. pattern에 *가 사용되는 경우에만 관련이 있다. 그렇지 않으면 %와 %%는 같은 방식으로 작동한다.


[~] s="boys, be ambitious"

[~] echo $s

boys, be ambitious

[~] echo ${s%%am*s}

boys, be

[~] echo ${s%%b*s}


[~] echo ${s%%s}
boys, be ambitiou

[~] echo ${s%%i*s}

boys, be amb




% 구문과 %% 구문의 경우 변수 값은 지정된 패턴으로 끝나야 한다.




${variable#pattern}

커맨드 라인에서 variable의 값을 사용하고 왼쪽부터 패턴을 제거한다.


예시는 다음과 같다.


[~] s="boys, be ambitious"

[~] echo $s

boys, be ambitious

[~] echo ${s#b}

oys, be ambitious

[~] echo ${s#b*s}

, be ambitious



${variable##pattern}

pattern의 가장 긴 항목이 왼쪽에서 제거된다는 점을 제외하고 # 형식과 유사하다.


예시는 다음과 같다. 


[~] s="boys, be ambitious"

[~] echo $s

boys, be ambitious

[~] echo ${s##b}

oys, be ambitious

[~] echo ${s##b*s}



 # 구문과 ## 구문의 경우 변수는 해당 변수로 시작해야 한다.







Posted by '김용환'
,