쉘에서 변수 대체에서의 패턴은 조금 특별히 봐야 한다.
패턴 매칭 구문은 하나의 변수 이름(또는 매개 변수 번호)과 하나의 패턴, 두 개의 매개 변수를 받는다. 쉘은 주어진 패턴과 일치하는 주어진 변수의 내용을 검색한다. 패턴이 일치하면 쉘은 커맨드 라인에서 패턴의 일치하는 부분을 삭제한 채 변수 값을 사용한다. 패턴이 일치하지 않으면 커맨드 라인에서 변수의 전체 내용을 사용한다. 두 경우 모두 변수의 내용이 변경되지 않는다.
패턴은 네 가지가 있다.
${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
${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%%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}
'unix and linux' 카테고리의 다른 글
라인 편집기 모드를 vi로 적용하기 (set -o vi) (0) | 2017.02.15 |
---|---|
간단하게 1>, >2, >&2, 2>&1, exec를 살펴보기 (1) | 2017.02.07 |
[shell] 쉘 스크립트 추적하기 - set -x/set +x (0) | 2017.02.03 |
[shell] 중괄호와 널에 대한 기본 문자열 (0) | 2017.02.02 |
export -p (0) | 2017.01.31 |