while 루프를 사용하여 Bash 스크립트에서 파일을 읽는 다양한 방법


이 기사는 while 루프를 사용하여 bash 스크립트에서 파일을 읽는 방법에 대한 모든 것입니다. 파일 읽기는 프로그래밍에서 일반적인 작업입니다. 다양한 방법과 사용하는 것이 더 효율적인 방법에 대해 잘 알고 있어야 합니다. bash에서 단일 작업은 여러 가지 방법으로 달성할 수 있지만 작업을 완료하는 데 항상 최적의 방법이 있으므로 이를 따라야 합니다.

while 루프를 사용하여 파일 내용을 읽는 방법을 보기 전에 while 루프가 작동하는 방식에 대한 빠른 입문서입니다. while 루프는 조건을 평가하고 조건이 참일 때 주어진 코드 세트를 반복합니다.

while [ CONDITION ]
do
    code block
done

while 루프 구문을 분석해 보겠습니다.

  1. while 루프는 조건이 뒤에 오는 while 키워드로 시작해야 합니다.
  2. 조건은 [ ] 또는 [[ ]]로 묶어야 합니다. 루프가 실행되려면 조건이 항상 true를 반환해야 합니다.
  3. 실제 코드 블록은 do와 done 사이에 위치합니다.
  4. NUMBER=0
    
    while [[ $NUMBER -le 10 ]]
    do
        echo " Welcome ${NUMBER} times "
        (( NUMBER++ ))
    done
    

    이것은 NUMBER가 10보다 크지 않을 때까지 루프가 실행되고 echo 문을 인쇄하는 매우 간단한 예입니다.

    while과 함께 read 명령을 사용하여 파일 내용을 한 줄씩 읽습니다. 다음은 while 및 read 명령을 결합하는 방법의 구문입니다. 이제 파일을 입력으로 전달하는 다양한 방법이 있으며 모두 볼 수 있습니다.

    # SYNTAX
    while read VARIABLE
    do
        code
    done
    

    Linux에서 배관

    일반적으로 정렬 등을 사용합니다.

    마찬가지로 여기에서 cat 명령을 사용하여 파일의 내용을 읽고 이를 while 루프로 파이프합니다. 데모를 위해 /etc/passwd 파일을 사용하고 있지만 이 파일을 엉망으로 만드는 것은 바람직하지 않으므로 이 파일의 백업 복사본을 가져 와서 원하는 경우 재생하십시오.

    cat /etc/passwd | while read LREAD
    do
        echo ${LREAD}
    done
    

    위의 코드가 제출될 때 어떤 일이 발생하는지 분석해 보겠습니다.

    1. cat /etc/passwd는 파일의 내용을 읽고 파이프를 통해 입력으로 전달합니다.
    2. 읽기 명령은 cat 명령에서 입력으로 전달된 각 줄을 읽고 LREAD 변수에 저장합니다.
    3. 읽기 명령은 EOL이 해석될 때까지 파일 내용을 읽습니다.
    4. 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 그리고 ).

      while read LREAD
      do
          echo ${LREAD}
      done < testfile
      

      결과를 보면 빈 줄이 무시되지 않습니다. 또한 흥미로운 점은 읽기 명령에 의해 공백이 잘리는 방식입니다. 파일 내용을 읽을 때 빈 줄을 무시하는 간단한 방법은 문자열 길이가 0인지 확인하는 -z 플래그와 함께 테스트 연산자를 사용하는 것입니다. 이제 동일한 예를 반복하지만 이번에는 테스트 연산자를 사용합니다.

      while read LREAD
      do
          if [[ ! -z $LREAD ]]
          then
              echo ${LREAD} 
          fi
      done < testfile
      

      이제 출력에서 빈 줄이 무시되는 것을 볼 수 있습니다.

      탈출 문자

      와 같은 이스케이프 문자\n, , <코드

      while read LREAD
      do
          echo ${LREAD}
      done < testfile
      

      출력에서 이스케이프 문자가 의미를 잃었고 대신 n과 t만 인쇄된 것을 볼 수 있습니다.\n . -r을 사용하여 백슬래시 해석을 방지할 수 있습니다.

      while read -r LREAD
      do
          echo ${LREAD}
      done < testfile
      

      그것이 이 글의 내용입니다. 피드백이나 팁이 있으면 언제든지 알려주세요. 귀하의 피드백은 더 나은 콘텐츠를 만드는 데 도움이 됩니다. 계속 읽고 지원하십시오.