제목을 좀 애매하게 달았지만, 이건 Shell 의 String Operations(The Linux Command Line p402)에 대한 내용이다.
예를 들어, 이런 문장에서, 5번째 글자부터 출력하고 싶다면?
foo="This string is too long."
문법은 이렇다.
${parameter:offset:length}
위 상황에 적용해보면 다음과 같다.
echo ${foo:5} string is too long.
length 를 넣어보자면,
echo ${foo:5:3} str
5부터 시작해서, 3글자만큼만 출력이 이뤄졌다.
만약, 5부터 시작해서, 끝에서 4번째까지만 뽑아내고 싶다면???
상황이 좀 복잡해진다.
먼저, 총 글자수를 알아내야 한다. 이 경우, # 를 사용한다.
변수 : ${#VAR} 인수 : ${#} 또는 ${#@}
${#foo} 는 $foo 의 크기(길이)를 출력해준다. 위의 경우 24 를 얻을 수 있다.
${#} 또는 ${#@} 는, 스크립트에 넘겨진 인수의 갯수를 의미한다.
예를 들어 ./bar a b c d
로 하고, 스크립트 내부에서 echo ${#} 를 실행했다면, 결과는 4가 된다.
다시 본론으로 돌아와서, 5번째 글자부터 시작, 끝에서 4번째 글자까지 뽑아내려면?
offset 은 5로 하면 되고, length 는 살짝 수학능력을 동원하여, ‘총길이 – 5(offset) – 4(끝에서 센 수)’ 를 넣어주면 된다.
echo ${foo:5:${#foo}-5-4}
‘네번째 글자까지’라고 했으니 ‘o’ 가 포함되어 한다고 하면, 4 대신 3을 넣어주면 된다.
그런데.. 이건 ‘문자열’일 때고, 내가 원하는 건, “스크립트에 넘겨진 ‘매개변수’ 중, 특정 차례에 오는 매개변수만 취하고 싶을 때 어찌해야 하나?” 였다.
자… 며칠 전부터 시작된 날개죽지 근육뭉침현상(표현이 길다..)으로 인해 원활한 활동이 어려웠기에, 이제야 정리할 수 있었는데, 아직도 확 눈에 들어오진 않는다.
좀 더 명확한 요구사항은, ‘첫번째와 마지막을 제외한 모든 매개변수를 얻고 싶다면?‘ 이다.
StackExchange 와, 위에서도 언급한 The Linux Command Line 에서 큰 도움을 얻었다.
결론만 정리하면 이렇다.
for i in "${@:2:${#}-2}"; do echo "$i" done
위에서 사용했던 문법과 동일하게 적용하면 된다. 다만 변수가 아니라 인수이기 때문에, @ 를 사용했고, 글자수 구문에서도 변수명 대신 # 를 사용한게 다르다.
${#} 나 $# 나 같다.
${#}-2 에서 -1 이 아닌 -2 가 된 이유는 위에 썼다.
마지막으로, 첫 인수와, 마지막 인수는 이렇게 얻을 수 있다.
first="$1" last="${@:$#}"
이 정도면 이 글 제목에 어울리는 글이 됐으려나..