이 문서는 while 루프를 사용하여 bash 스크립트에서 파일을 읽는 방법에 관한 모든 것입니다. . 파일 읽기는 프로그래밍에서 일반적인 작업입니다. 다양한 방법과 사용하는 것이 더 효율적인 방법에 대해 잘 알고 있어야 합니다. bash에서는 단일 작업을 여러 가지 방법으로 달성할 수 있지만 작업을 완료하는 데 항상 최적의 방법이 있으므로 이를 따라야 합니다.
while 루프를 사용하여 파일 내용을 읽는 방법을 보기 전에 , while 루프가 작동하는 방식에 대한 빠른 입문서. while 루프는 조건을 평가하고 조건이 참일 때 주어진 코드 세트를 반복합니다.
while [ CONDITION ] do code block done
while 루프를 분석해 보겠습니다. 구문.
- while 루프 while 키워드로 시작하고 그 뒤에 조건이 와야 합니다.
- 조건 [ ] 안에 넣어야 합니다. 또는 [[ ]] . 루프가 실행되려면 조건이 항상 true를 반환해야 합니다.
- 실제 코드 블록은 do 사이에 배치됩니다. 완료 .
NUMBER=0 while [[ $NUMBER -le 10 ]] do echo " Welcome ${NUMBER} times " (( NUMBER++ )) done
이것은 루프가 있는 매우 간단한 예입니다. NUMBER까지 실행 10보다 크지 않음 echo 문을 출력합니다.
동안과 함께 읽기를 사용합니다. 파일의 내용을 한 줄씩 읽는 명령. 다음은 while의 구문입니다. 그리고 읽기 명령이 결합됩니다. 이제 파일을 입력으로 전달하는 다양한 방법이 있으며 모두 볼 수 있습니다.
# SYNTAX while read VARIABLE do code done
리눅스에서 파이핑
일반적으로 터미널에서 파일 내용을 보기 위해 cat 명령을 사용합니다. 또한 cat 명령의 출력을 파이프합니다. grep, sort 등과 같은 다른 명령으로.
마찬가지로 cat 명령을 사용합니다. 여기에서 파일의 내용을 읽고 while로 파이프합니다. 고리. 데모를 위해 /etc/passwd를 사용하고 있습니다. 파일이지만 이 파일을 엉망으로 만드는 것은 바람직하지 않으므로 이 파일의 백업 복사본을 가져 와서 원하는 경우 재생하십시오.
cat /etc/passwd | while read LREAD do echo ${LREAD} done
위의 코드를 제출하면 어떻게 되는지 알아보겠습니다.
- 고양이 /etc/passwd 파일의 내용을 읽고 파이프를 통해 입력으로 전달합니다.
- 읽기 명령은 cat 명령에서 입력으로 전달된 각 줄을 읽고 LREAD에 저장합니다. 변수.
- 읽기 명령은 EOL까지 파일 내용을 읽습니다. 해석됩니다.
head, tail과 같은 다른 명령을 사용하고 while 루프에 파이프할 수도 있습니다.
head -n 5 /etc/passwd | while read LREAD do echo ${LREAD} done
Linux에서 입력 리디렉션
파일의 내용을 while 루프로 리디렉션할 수 있습니다. 입력 리디렉션 연산자 (<)
사용 .
while read LREAD do echo ${LREAD} done < /etc/passwd | head -n 5
파일 이름을 변수에 저장하고 리디렉션 연산자를 통해 전달할 수도 있습니다.
FILENAME="/etc/passwd" while read LREAD do echo ${LREAD} done < ${FILENAME}
스크립트에 대한 인수로 파일 이름을 전달할 수도 있습니다.
while read LREAD do echo ${LREAD} done < $1 | head -n 5
내부 필드 구분자
다양한 유형의 파일 형식(CSV , TXT , JSON ) 사용자 정의 구분 기호를 기반으로 파일의 내용을 분할할 수 있습니다. 이 경우 "내부 필드 구분자(IFS)를 사용할 수 있습니다. "를 사용하여 파일 내용을 분할하고 변수에 저장합니다.
어떻게 작동하는지 보여드리겠습니다. /etc/passwd를 살펴보세요. 콜론 (:)
이 있는 파일 구분자로. 이제 줄에서 각 단어를 분리하여 별도의 변수에 저장할 수 있습니다.
아래 예에서는 /etc/passwd를 분할합니다. 콜론을 구분 기호로 사용하고 각 분할을 다른 변수로 저장합니다.
while IFS=":" read A B C D E F G do echo ${A} echo ${B} echo ${C} echo ${D} echo ${E} echo ${F} echo ${G} done < /etc/passwd
스크린샷 크기를 고려하여 위 스크린샷에서 한 줄만 분할하여 표시했습니다.
Linux의 빈 줄
반복할 때 빈 줄은 무시되지 않습니다. 파일 내용을 통해 이를 보여주기 위해 아래 내용으로 샘플 파일을 만들었습니다. 4줄과 몇 개의 빈 줄, 선행 공백, 후행 공백, 2행의 탭 문자 및 일부 이스케이프 문자(\n 및 \t ).
while read LREAD do echo ${LREAD} done < testfile
결과를 보면 빈 줄이 무시되지 않습니다. 또한 흥미로운 점은 공백이 읽기 명령. 파일 내용을 읽을 때 빈 줄을 무시하는 간단한 방법은 테스트 연산자를 -z
와 함께 사용하는 것입니다. 문자열 길이가 0인지 확인하는 플래그입니다. 이제 동일한 예를 반복하지만 이번에는 테스트 연산자를 사용합니다.
while read LREAD do if [[ ! -z $LREAD ]] then echo ${LREAD} fi done < testfile
이제 출력에서 빈 줄이 무시되는 것을 볼 수 있습니다.
이스케이프 문자
\n
와 같은 이스케이프 문자 , \t
, \c
파일을 읽을 때 인쇄되지 않습니다. 이를 보여주기 위해 이스케이프 문자가 거의 없는 동일한 샘플 파일을 사용하고 있습니다.
while read LREAD do echo ${LREAD} done < testfile
출력에서 이스케이프 문자가 의미를 잃고 n개만 표시되는 것을 볼 수 있습니다. 그리고 t \n
대신 인쇄됩니다. 및 \t
. -r
을 사용할 수 있습니다. 백슬래시 해석을 방지합니다.
while read -r LREAD do echo ${LREAD} done < testfile
그것이 이 글의 내용입니다. 피드백이나 팁이 있으면 언제든지 알려주세요. 귀하의 피드백은 더 나은 콘텐츠를 만드는 데 도움이 됩니다. 계속 읽고 계속 지원하십시오.