/tmp/urlFile
각 줄이 URL을 나타내는 이라는 파일이 있습니다 . 다음과 같은 파일을 읽으려고 합니다.
cat "/tmp/urlFile" | while read url
do
echo $url
done
마지막 줄이 개행 문자로 끝나지 않으면 해당 줄은 읽혀지지 않습니다. 이유를 알고 싶습니다.
새 줄로 끝나는지 여부에 관계없이 모든 줄을 읽을 수 있습니까?
답변1
당신은 이렇게 할 것입니다 :
while IFS= read -r url || [ -n "$url" ]; do
printf '%s\n' "$url"
done < url.list
(실제로 루프는 마지막 (비) 줄에 누락된 개행 문자를 추가합니다).
또한보십시오:
답변2
글쎄, read
개행 이전에 파일 끝을 발견하면 거짓 값을 반환하지만, 그렇다고 하더라도 여전히 읽은 값을 할당합니다. 따라서 최종 호출이 read
빈 줄이 아닌 다른 것을 반환하는지 확인하고 정상적으로 처리할 수 있습니다. 따라서 read
false를 반환한 후에만 루프를 종료하세요.그리고줄이 비어 있습니다.
#!/bin/sh
while IFS= read -r line || [ "$line" ]; do
echo "line: $line"
done
$ printf 'foo\nbar' | sh ./read.sh
line: foo
line: bar
$ printf 'foo\nbar\n' | sh ./read.sh
line: foo
line: bar
답변3
통과정의, 텍스트 파일은 일련의 줄로 구성됩니다. ㅏ철사개행 문자로 끝납니다. 따라서 텍스트 파일은 비어 있지 않으면 개행 문자로 끝납니다.
내장 read
기능은 텍스트 파일을 읽는 용도로만 사용됩니다. 텍스트 파일을 전달하지 않으므로 원활하게 작동할 것으로 기대할 수 없습니다. 쉘은 모든 라인을 읽습니다 - 건너뛰는 것은 마지막 라인 뒤의 추가 문자입니다.
잘못된 형식의 입력 파일이 있는 경우(마지막 줄이 누락되었을 수 있음) 확실하게 확인하기 위해 줄바꿈을 추가할 수 있습니다.
{ cat "/tmp/urlFile"; echo; } | …
텍스트 파일이어야 하지만 마지막 개행 문자가 누락된 파일은 일반적으로 Windows 편집기에서 생성됩니다. 이는 일반적으로 Unix의 LF보다는 Windows 줄 종결자 CR LF와 함께 사용됩니다. CR 문자는 어느 곳에서나 거의 유용하지 않으며 어떤 상황에서도 URL에 표시되어서는 안 되므로 제거해야 합니다.
{ <"/tmp/urlFile" tr -d '\r'; echo; } | …
입력 파일의 형식이 올바르고 줄 바꿈으로 끝나는 경우 echo
빈 줄이 추가됩니다. URL은 비워둘 수 없으므로 빈 줄을 무시하세요.
또한 read
직접적인 방법으로 행을 읽지 않는다는 점에 유의하십시오. URL에 이상적일 수 있는 선행 및 후행 공백을 무시합니다. 줄 끝의 백슬래시를 이스케이프 문자로 처리하여 다음 줄이 첫 번째 줄에서 백슬래시 줄 바꿈 시퀀스를 뺀 것과 연결되도록 하는데, 이는 절대적으로 바람직하지 않습니다. 따라서 -r
옵션을 에 전달 해야 합니다 read
. 이는 매우 드물며 read
올바른 일이 아닙니다 read -r
.
{ <"/tmp/urlFile" tr -d '\r'; echo; } | while read -r url
do
if [ -z "$url" ]; then continue; fi
…
done
답변4
또 다른 방법은 다음과 같습니다.
읽기가 줄 끝이 아닌 파일 끝에 도달하면 데이터를 읽고 변수에 할당하지만 0이 아닌 상태로 종료됩니다. 루프가 "읽는 동안, 작업을 수행하고, 완료되는 동안" 구성되는 경우
따라서 읽기 종료 상태를 직접 테스트하는 대신 플래그를 테스트하고 읽기 명령이 루프 본문 내부에서 해당 플래그를 설정하도록 하십시오. 이렇게 하면 읽기의 종료 상태에 관계없이 전체 루프 본문이 실행됩니다. 왜냐하면 읽기는 루프의 명령 목록 중 하나일 뿐이고 다른 명령과 마찬가지로 루프 실행 여부를 결정하는 요소가 전혀 아니기 때문입니다.
DONE=false
until $DONE ;do
read || DONE=true
echo $REPLY
done < /tmp/urlFile
추천한 사람여기.