반달가면 이글루에서 백업 - 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'
'bash script' 카테고리의 다른 글
[bash: awk] awk에서 출력할 문자열을 변수로 지정하기 (0) | 2023.07.14 |
---|---|
[bash: curl] curl을 이용한 FTP 자동 접속 (0) | 2023.07.11 |
[bash: ((] 정수 계산 및 변수값 증가/감소 (0) | 2023.07.11 |
[bash: ;] 한줄에 여러개의 명령 입력하기 (0) | 2023.07.06 |
[bash: xargs] 앞 명령어의 출력 결과를 다음 명령어의 인자(argument)로 사용하기 (0) | 2023.07.06 |