반응형
만약 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
반응형
'Linux' 카테고리의 다른 글
[linux] shutdown 명령어시 나오는 ignoring: Interactive authentication required. 에러 해결법 (0) | 2023.02.08 |
---|---|
[linux] sed 명령어를 통한 파일 문자열 치환 예제 (0) | 2022.04.17 |
[linux] 특정 프로세스가 사용중인 파일 확인 (lsof) (0) | 2022.04.11 |
curl에서 PUT 명령어시 Content-Type header [application/x-www-form-urlencoded] is not supported 에러 해결 (0) | 2022.03.10 |
[linux] apt와 apt-get의 차이 (0) | 2022.02.05 |