Bash/Zsh: 첫번째/마지막 인수 제외 후 처리.

제목을 좀 애매하게 달았지만, 이건 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="${@:$#}"

이 정도면 이 글 제목에 어울리는 글이 됐으려나..

안녕하세요. 글 남겨주셔서 고맙습니다.