
test
포함 이라는 파일이 있습니다
test
test
그리고 나는 이 명령을 실행하고 있어요
while read line
do
echo "$line"
done </tmp/test
이는 "test"를 두 번 출력해야 하지만 한 번만 출력합니다. 사용해도 while IFS= read -r line
아무 것도 바뀌지 않습니다. 이 문제를 해결하려면 세 번째 빈 줄을 출력해야 하지만 상관없이 작동해야 합니다.
답변1
노력하다:
while IFS='' read -r line || [ "$line" ]
예, 표준 입력(stdin)에서 읽고 있으며 <test
리디렉션은 stdin으로 이동합니다.
일어날 수 있는 일은 읽기가 텍스트 파일과 함께 작동하도록 설계되었다는 것입니다.올바른 텍스트 파일은 줄바꿈으로 끝나야 합니다..
만들기 위해개행 문자의 파일 끝이 매우 빠른 것으로 나타났습니다.:
[ -n "$(tail -c1 file)" ] && printf '\n' >>file
그러나 파일을 편집하여 줄 바꿈(누락된 경우)을 추가할 수 없는 경우 해결책은 내용을 읽었는지 추가로 테스트하는 것입니다.
while read line || [ "$line" ]
읽기가 실패했지만(기본적으로 개행을 읽지 않고 파일 끝에 도달했지만) (in "$line"
)에서 무언가를 읽은 경우 루프가 실행됩니다.
개행 문자로 끝나는지 여부에 관계없이 파일에 대해 올바르게 작동합니다.
아니요, a는 IFS='' read
마지막 줄 읽기에 (직접적으로) 영향을 미치지 않습니다. 실제로 IFS=''
(기본 IFS와 비교하여)[ㅏ]공백, 탭, 개행)은 분할에만 영향을 미칩니다.여러 개의변수(선행 및/또는 후행 공백 제거에 영향을 미치는 것 외에(IFS에 공백만 포함된 경우)[비])). 변수( )가 하나뿐이므로 "$line"
분할이 수행되지 않습니다.
-d
읽기 옵션(2.04 이후 bash에서)도 도움이 되지 않습니다 . 일치시킬 특정 "파일 끝" 문자는 없습니다(마지막 바이트는 임의의 바이트일 수 있음).
남은 유일한 옵션은 다음 중 하나입니다.
- 파일을 복구하여 올바른 텍스트 파일로 만들려면
- 변수에 읽혀진 내용이 있는지 테스트합니다
line
.
그러면 올바른 스크립트는 다음과 같습니다.
#!/bin/bash
while IFS='' read -r line || [ "$line" ]
do
printf '%s\n' "$line"
done <test
IFS='' IFS의 일반적이지 않은 값과 관련된 문제를 방지하는 데 사용됩니다.
[a][b]물론 IFS에 값이 있으면 다른 많은 문자가 제거될 수 있습니다. 시도('x'로 끝나는 값의 경우)
printf "test\ntesx\ntest" | while IFS="x" read -r line || [ "$line" ]; do echo "$line"; done
아니요, zsh는 다른 작업을 수행합니다.