본문 바로가기

Linux

[bash] loop돌때 파일의 맨 마지막 라인이 출력되지 않는 문제

반응형

 

 

 

 

만약 test.txt 파일에 아래와 같은 정보가 있다하자.

1
2
3
4
5

이를 loop를 돌면서 출력하는데, 마지막 문자는 출력되지 않는 경우가 있다.

 

#!/bin/bash

while read -r line ;
do 
    echo "$line";
done < <(cat test.txt)


### 출력
1
2
3
4

대체 이게 무슨 상황인가 싶어서 한참을 봤는데,

문제는 해당 텍스트 파일의 끝이 newline으로 끝나지 않은 경우에 발생하는 문제다.

POSIX 스펙에 따르면 read 커맨드는 파일의 끝에 도달하거나 에러가 발생하면 Non zero status를 리턴한다. 

read 커맨드가 파일의 끝에 도달하면 $line 변수에 갚을 할당하고 루프는 종료하게 된다. 

그래서 맨 마지막 문자가 출력이 안된다.

 

이를 해결하려면 두가지 방법이 있는데,

1. 파일의 맨마지막에 newline을 추가한다. 

2. 아래 코드를 사용한다. 

 

#!/bin/bash

while read -r line || [ -n "$line" ];
do 
    echo "$line";
done < <(cat test.txt)


## 출력
1
2
3
4
5

위 처럼 해당 문제를 해결할 수 있다.

즉 $line에 문자열이 셋팅되어 있는경우 해당 루프를 수행하도록 한다. 그러면 맨 마지막라인을 출력할 수 있게 된다. 

 

 

참고 : https://stackoverflow.com/questions/12916352/shell-script-read-missing-last-line

반응형