[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':;"
Author And Source
이 문제에 관하여([shell script] 내부 필드 분리자(IFS)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@khyup0629/shell-script-내부-필드-분리자IFS저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)