1년 중 그 시즌이 다시 돌아왔습니다! 상점마다 알록달록하고 반짝이는 장식을 내걸기 시작하면 누구나 조금씩 축제 분위기를 느끼게 되죠. 물론 여기서 말하는 '축제 분위기'란 곧 쇼핑을 하러 가자는 뜻입니다. 특히 연휴 선물 쇼핑! (엄밀히 따지면 자신에게 주는 선물도 선물입니다.)
모든 게 엉망이 되지 않도록 선물 목록을 미리 만들어 두는 게 좋겠죠. Bash가 도와드리겠습니다.
중괄호 확장(Brace Expansion)
다음은 중괄호가 아닙니다: ()
이것도 아닙니다: []
이것이 바로 중괄호입니다: {}
중괄호는 Bash에게 그 사이에 있는 문자열들을 가지고 어떤 작업을 수행하라고 지시합니다. 여러 문자열은 쉼표로 구분합니다: {a,b,c}. 각 확장 결과 앞뒤에 붙일 접두사와 접미사를 선택적으로 추가할 수도 있습니다. 대부분의 경우 흔한 파일 경로나 확장자를 다룰 때 타이핑을 크게 줄여줍니다.
선물을 줄 사람마다 목록을 만들어 보겠습니다. 다음 명령어들은 서로 동일합니다:
touch /home/me/gift-lists/Amy.txt /home/me/gift-lists/Bryan.txt /home/me/gift-lists/Charlie.txttouch /home/me/gift-lists/{Amy,Bryan,Charlie}.txttree gift-lists
/home/me/gift-lists
├── Amy.txt
├── Bryan.txt
└── Charlie.txt앗, "Bryan"은 이름을 "i"로 표기하더군요. 고쳐 보겠습니다.
mv /home/me/gift-lists/{Bryan,Brian}.txt
renamed '/home/me/gift-lists/Bryan.txt' -> '/home/me/gift-lists/Brian.txt'셸 매개변수 확장(Shell Parameter Expansions)
셸 매개변수 확장을 사용하면 중괄호로 묶인 매개변수를 다양하게 조작할 수 있습니다. 텍스트 치환 같은 작업도 가능하죠.
선물 받을 모든 사람에게 넣어 줄 만한 작은 선물들이 있습니다. 변수로 만들어 보겠습니다:
STUFF=$'socks\nlump of coal\nwhite chocolate'
echo "$STUFF"
socks
lump of coal
white chocolate이제 tee 명령어의 도움을 받아 echo와 확장 기능이 잘 어우러지도록 한 뒤, 이 항목들을 각 목록에 추가해 보겠습니다.
echo "$STUFF" | tee {Amy,Brian,Charlie}.txt
cat {Amy,Brian,Charlie}.txt
socks
lump of coal
white chocolate
socks
lump of coal
white chocolate
socks
lump of coal
white chocolate패턴 매치 치환(Pattern Match Substitution)
잠깐, 다시 생각해 보니 석탄 덩어리(lump of coal)는 별로 좋은 선물이 아닌 것 같네요. ${parameter/pattern/string} 형식의 패턴 매치 치환을 사용하면 더 나은 것으로 바꿀 수 있습니다:
echo "${STUFF/lump of coal/candy cane}" | tee {Amy,Brian,Charlie}.txt
cat {Amy,Brian,Charlie}.txt
socks
candy cane
white chocolate
socks
candy cane
white chocolate
socks
candy cane
white chocolate이렇게 하면 첫 번째 "lump of coal"이 "candy cane"으로 교체됩니다. 모든 인스턴스(여러 개가 있다면)를 교체하려면 ${parameter//pattern/string}을 사용하세요. 이 방법은 $STUFF 변수 자체를 변경하지 않으므로, 나중에 못된 아이를 위한 원래 목록을 그대로 재사용할 수 있습니다.
부분 문자열(Substrings)
목록을 개선하는 김에, 화이트 초콜릿을 좋아하지 않는 사람도 있을 수 있겠죠. 만약을 대비해 일반 초콜릿도 추가하는 게 좋겠습니다. 저는 워낙 게을러서 위쪽 화살표 키를 눌러 이전 Bash 명령어를 수정하는 편입니다. 다행히 $STUFF 변수의 마지막 단어가 9글자짜리 "chocolate"이므로, ${parameter:offset}을 사용해 그 부분만 남기라고 Bash에 지시할 수 있습니다. 기존 목록에 덧붙이기 위해 tee의 -a(append) 옵션도 함께 사용하겠습니다:
echo "${STUFF: -9}" | tee -a {Amy,Brian,Charlie}.txt
cat {Amy,Brian,Charlie}.txt
socks
candy cane
white chocolate
chocolate
socks
candy cane
white chocolate
chocolate
socks
candy cane
white chocolate
chocolate다음과 같은 것도 할 수 있습니다:
| 이런 작업 | 이렇게 |
|---|---|
| n번째 문자부터 끝까지 부분 문자열 가져오기 | ${parameter:n} |
| n번째 문자부터 x개 문자에 해당하는 부분 문자열 가져오기 | ${parameter:n:x} |
자, 이제 기본 목록이 완성되었습니다. 에그노그 한 잔 마시러 가죠.
변수 테스트(Testing Variables)
에그노그 때문인지 모르겠지만, 어제 Amy용 목록을 시작해서 amy라는 변수에 저장해 뒀던 것 같기도 합니다. 확인해 보겠습니다. ${parameter:?word} 확장을 사용하면 됩니다. amy 매개변수가 없으면 word를 표준 오류에 출력하고 종료합니다.
echo "${amy:?no such}"
bash: amy: no such역시 아니었나 보군요. 혹시 Brian이었을까요?
echo "${brian:?no such}"
Lederhosen다음과 같은 것도 할 수 있습니다:
| 이런 작업 | 이렇게 |
|---|---|
parameter가 설정되지 않았거나 null이면 word로 대체 | ${parameter:-word} |
parameter가 설정되어 있고 null이 아니면 word로 대체 | ${parameter:+word} |
parameter가 설정되지 않았거나 null이면 word를 parameter에 할당 | ${parameter:=word} |
대소문자 변경(Changing Case)
맞다! Brian이 레더호젠(Lederhosen)을 원한다고 해서 메모해 뒀었습니다. 꽤 중요한 일이니 ${parameter^^pattern} 확장을 사용해 대문자로 변환한 뒤 Brian의 목록에 추가하겠습니다. pattern 부분은 선택 사항입니다. Brian의 목록에만 쓰면 되니 tee -a 대신 >>를 사용하겠습니다.
echo "${brian^^}" >> Brian.txt
cat Brian.txt
socks
candy cane
white chocolate
chocolate
LEDERHOSEN다음과 같은 것도 할 수 있습니다:
| 이런 작업 | 이렇게 |
|---|---|
| 첫 글자만 대문자로 변경 | ${parameter^pattern} |
| 첫 글자만 소문자로 변경 | ${parameter,pattern} |
| 모든 글자를 소문자로 변경 | ${parameter,,pattern} |
배열 확장(Expanding Arrays)
솔직히 말해서, 이런 선물 목록 작업은 꽤 손이 많이 가죠. 그냥 가게에서 본 물건들의 배열을 만들어 버리겠습니다:
gifts=(sweater gameboy wagon pillows chestnuts hairbrush)${parameter:offset:length} 형식의 부분 문자열 확장을 활용하면 아주 간단합니다. 처음 두 개는 Amy의 목록에, 가운데 두 개는 Brian의 목록에, 마지막 두 개는 Charlie의 목록에 추가하겠습니다. 줄바꿈 처리를 위해 printf를 사용합니다.
printf '%s\n' "${gifts[@]:0:2}" >> Amy.txt
printf '%s\n' "${gifts[@]:2:2}" >> Brian.txt
printf '%s\n' "${gifts[@]: -2}" >> Charlie.txtcat Amy.txt
socks
candy cane
white chocolate
chocolate
sweater
gameboy
cat Brian.txt
socks
candy cane
white chocolate
chocolate
LEDERHOSEN
wagon
pillows
cat Charlie.txt
socks
candy cane
white chocolate
chocolate
chestnuts
hairbrush완성했습니다! 이제 개인 맞춤형 선물 목록 세트가 완성되었습니다. 고마워요, Bash! 아쉽게도 쇼핑까지 대신해 주진 못하지만요.