bash script2023. 7. 11. 11:42

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/583019

 

리눅스 bash 스크립트에서 텍스트 파일을 읽어서 각 행을 배열(array)에 할당하는 방법이다. 예를 들어 test.txt 파일의 내용이 아래와 같다고 생각해 보자.

# test.txt 파일 내용 확인
cat test.txt
my name is john
your name is jane
his name is thomas

위의 내용을 배열 arr에 할당하는 작업이다. arr[0]의 내용은 "my name is john", arr[1]의 내용은 "your name is jame" 이런 식이 될 것이다. 배열에 대한 자세한 내용은 이전 게시물을 참고하자. 여기로

 

cat 명령을 이용해서 파일 내용을 출력하고 이것을 그대로 배열 변수에 할당할 경우, 한 줄씩 할당되는 것이 아니라 한 단어씩 할당된다. 아래의 예시를 보자.

# test.txt의 내용을 배열 arr에 할당
arr=(`cat test.txt`)

# 배열 원소 확인
echo ${arr[0]}
my
echo ${arr[1]}
name
echo ${arr[2]}
is

이렇게 되는 이유는 bash의 내부 필드 구분자(internal field separator)가 공백/탭/줄바꿈이기 때문이다. 따라서 한줄을 배열 원소 하나에 대응시키려면 구분자를 줄바꿈(newline) 하나로 제한시켜야 한다. 구분자는 변수 IFS에 설정되어 있다.

기존의 IFS 값을 IFS_backup 변수에 저장한 후, 배열 할당 작업을 하고 나서 원상복구하는 방식으로 작업을 하면 된다.

# 기존 IFS 백업
IFS_backup="$IFS"

# IFS 값을 줄바꿈으로 변경
IFS=$'\n'

# 배열 할당
arr=(`cat test.txt`)

# IFS 원상복구
IFS="$IFS_backup"

이제 배열 원소의 내용을 확인해 보면 하나의 원소에 파일 내용이 한 줄씩 들어가 있는 것을 볼 수 있다.

# 배열 원소 확인
echo ${arr[0]}
my name is john
echo ${arr[1]}
your name is jane

위의 예시에서 IFS 변수의 내용을 줄바꿈으로 설정할 때 echo 명령을 이용하면 제대로 되지 않음에 유의하자.

# IFS를 줄바꿈으로 설정 시도. 이런 식으로는 작동하지 않음
IFS=`echo -e "\n"`

제대로 작동하지 않는 이유는, 역따옴표(`) 안에 제시한 명령을 실행한 결과를 IFS에 할당하면서 맨 뒤에 있는 줄바꿈을 자동으로 제거하기 때문이다. 따라서 반드시 $'\n' 형태를 사용해야 한다.

# IFS를 줄바꿈으로 설정
IFS=$'\n'

 

728x90
Posted by 반달가면