2013-09-08 4 views
5

file.txt입니다 :배쉬 : 고양이와 에코의 차이는

[email protected]:~/Desktop$ cat file.txt 
foo:bar:baz:qux:quux 
one:two:tree:four:five:six:seven 
alpha:beta:gamma:delta:epsilon:zeta:eta:teta:iota:kappa:lambda:mu 
the quick brown fox jumps over the lazy [email protected]:~/Desktop$ cat read.sh 
while read -r line 
do 
    echo $line 
done < file.txt 

[email protected]:~/Desktop$ ./read.sh 
foo:bar:baz:qux:quux 
one:two:tree:four:five:six:seven 
alpha:beta:gamma:delta:epsilon:zeta:eta:teta:iota:kappa:lambda:mu 

내 질문은 : read.sh 마지막 표시되지 않습니다

foo:bar:baz:qux:quux 
one:two:tree:four:five:six:seven 
alpha:beta:gamma:delta:epsilon:zeta:eta:teta:iota:kappa:lambda:mu 
the quick brown fox jumps over the lazy dog 

이 내가 터미널에서 뭘하려 라인 끝은 cat file.txt입니까?

답변

6

당신이 경우 file.txt를 라인의 끝이 없기 때문에 :

$ od -c file.txt 
0000000 f o o : b a r : b a z : q u x : 
0000020 q u u x \n o n e : t w o : t r e 
0000040 e : f o u r : f i v e : s i x : 
0000060 s e v e n \n a l p h a : b e t a 
0000100 : g a m m a : d e l t a : e p s 
0000120 i l o n : z e t a : e t a : t e 
0000140 t a : i o t a : k a p p a : l a 
0000160 m b d a : m u \n t h e  q u i c 
0000200 k  b r o w n  f o x  j u m p 
0000220 s  o v e r  t h e  l a z y  
0000240 d o g 

파일의 끝 부분에 더 \n를이 없습니다.

echo 다른 한편으로는 메시지가없는 경우 에코를 줄 때 항상 새 줄을 추가합니다.

+0

'wc -l'은 이것을 확인하는 좋은 방법입니다. 'od -ta'는 줄 바꿈 문자가있는 곳을 보여줍니다. – Joe

+1

@Joe wc -l은 이것을 탐지하는 것이 옳지 않습니다 : 훈련이 없다면 3을 보여줍니다. \ n -'od -c'는 팁을 주셔서 감사합니다. –

1

입력 파일이 개행 문자로 끝나지 않습니다.

cat file은 단순히 파일 내용을 표준 출력으로 복사합니다. 그것은 문자가 아닌 행으로 작동하므로 파일이 개행 문자로 끝나는 지 상관 없습니다. 그러나 개행에서 끝나지 않으면 출력에 추가하지 않습니다.

read -r line은 변수에 행을 읽습니다. 줄 바꿈이 끝나면 성공을보고합니다. 입력의 마지막 행이 개행에서 끝나지 않으면 EOF에 도달 한 것처럼 오류를보고합니다. 따라서 루프는 해당 행을 반환하는 대신 마지막 행을 읽으려고 할 때 종료됩니다. 그래서 스크립트는 the quick brown fox으로 시작하는 줄을 표시하지 않습니다.

일반적으로 유닉스 텍스트 파일 프로그램은 개행 문자로 끝나는 텍스트 파일에서만 작동하도록 정의됩니다. 줄 바꿈이없는 경우 마지막 줄을 처리하는 것은 일반적으로 지정되지 않습니다.

+0

'read '가 오류를 반환하면 실제로 변수의 내용을 살펴 본 적이 없으므로 구별하지 못했습니다. 내 대답을 업데이트했습니다. – Barmar

0

file.txt에는 마지막 줄 끝에 개행 문자가 포함되어 있지 않습니다. 따라서 cat에는 표시되지 않습니다. read.shread 입력의 전체 라인을 기다리고, 그리고 실제로 읽을되지 않도록 마지막 줄 이후, 줄 바꿈에 의해 종료되지, read.sh에 ... 모두 마지막 줄에 표시되지 않습니다

참고.

4

다른 답변은 맞습니다. file.txt의 끝에는 개행 문자가 없습니다.

대부분의 텍스트 편집기는 자동으로 개행 문자가있는 파일을 종료합니다. nano도 마찬가지입니다. 하지만 당신의 파일은 스크립트에 의해 생성되었습니다. 맞습니까? 은 당신이해야 할 모든이이 문제를 재현하려면 다음

echo -n 'hello world' >> file.txt 

-n 플래그는 뒤에 줄 바꿈 출력하지 에코 알려줍니다.당신이 당신의 read 코드가 작동하려면

또한, 당신은이를 사용할 수 있습니다

이 실제로 read 변수에 마지막 선을 배치하기 때문에 일 것입니다
while read -r line 
do 
    printf "%s\n" "$line" 
done < file.txt 
[[ -n $line ]] && printf '%s' "$line" 

뿐만 아니라 를 반환합니다 false, while 루프가 깨졌습니다.