[shell script] 내부 필드 분리자(IFS)

각 데이터를 어떤 것을 기준으로 구분할 것인가 : IFS

IFS(Internal Field Separator)는 특수한 환경 변수로 bash 쉘이 필드 구분자로 사용하는 문자의 목록을 정의합니다.

기본값은 빈 칸입니다.

그래서 아래와 같이 states 파일의 내용을 작성하고,

$ cat states
A
B
C
D
E
F G
H I J

아래의 스크립트를 실행해보면, 결과값이 다르게 나오는 것을 확인할 수 있습니다.

$ cat test1
#!/bin/bash
for test in $(cat states)
do
        echo "word: $test"
done

$ ./test1
word: A
word: B
word: C
word: D
word: E
word: F
word: G
word: H
word: I
word: J

궁극적으로 원하는 것은 줄바꿈을 기준으로 구분하는 것입니다.

IFS라는 환경 변수를 '\n'으로 변경해주면 됩니다.

$ cat test1
#!/bin/bash
IFS_OLD=$IFS
IFS=$'\n'
for test in $(cat states)
do
        echo "word: $test"
done
IFS=$IFS_OLD

$ ./test1
word: A
word: B
word: C
word: D
word: E
word: F G
word: H I J

TIP
위 스크립트에는 유용한 트릭이 존재하는데요.
단순히 IFS값을 변경만 하고 돌려놓지 않게 되면, 그 값으로 설정되어 버립니다.
만약 다른 스크립트를 작성할 때 당연히 필드 구분자가 기본값이라 생각하고 진행했다가 낭패를 볼 수도 있겠죠.
그래서 기존의 IFS값을 IFS_OLD에 저장해두고, IFS 값을 변경해 사용한 다음 다시 기존의 값으로 되돌리는 것입니다.

다양한 필드 구분자

필드 구분자에는 종류의 제한이 없습니다.

아래에는 자주 쓰이는 필드 구분자를 모아봤습니다.

종류설명
'\n'줄바꿈을 기준으로 구분
:콜론을 기준으로 구분
;세미콜론을 기준으로 구분
"큰따옴표를 기준으로 구분
......

'\n'의 경우만 $를 붙인 IFS=$'\n'의 형식으로 지정해주고,
나머지 필드 구분자는 IFS=:와 같이 $ 없이 지정합니다.

여러 필드 구분자를 한꺼번에 적용하기

만약 필드 구분자로 '\n', :, ;, "를 한 번에 적용하고 싶다면 아래와 같이 변수를 할당하면 됩니다.

IFS=$'\n':;"

좋은 웹페이지 즐겨찾기