bash 내장 명령 mapfile: 파일 내용 을 배열 로 읽 기

3953 단어
bash 는 두 개의 내 장 된 명령 을 제공 합 니 다. readarray 와 mapfile 은 동의어 입 니 다.이들 의 역할 은 표준 입력 에서 한 줄 의 데 이 터 를 읽 은 다음 줄 마다 배열 의 각 요소 에 값 을 부여 하 는 것 이다.분명 한 것 은 셸 프로 그래 밍 에서 파일, 파이프 에서 읽 는 것 이지 만 파일 설명자 에서 도 데 이 터 를 읽 을 수 있 습 니 다.
먼저 설명해 야 할 것 은 셸 은 다른 전문 적 인 프로 그래 밍 언어 와 달리 배열, 목록 에 대량의 조작 도 구 를 제공 하지 않 고 오히려 텍스트 파일 을 직접 조작 하 는 것 이 더 흔 하기 때문에 mapfile 은 많이 사용 하지 않 습 니 다.
1. 문법
mapfile [OPTIONS] ARRAY
readarray [OPTIONS] ARRAY

  options:
-O INDEX   :              ,             0
-n count   :            ,  count=0,      
-s count   :   count    
-c NUM     :   NUM      "-C callback"     callback  
-C callback:   "-c NUM"     NUM      callback    
-d string  :            ,      
-t         :        ,      
-u fd      :        fd           
  • ARRAY 인 자 를 지정 하지 않 으 면 기본적으로 배열 MAPFILE
  • 를 사용 합 니 다.
  • '- O' 옵션 을 지정 하지 않 으 면 데 이 터 를 저장 하기 전에 배열 을 비 웁 니 다 (이 배열 이 존재 한다 면)
  • "- C callback"이 지정 되 었 으 나 "- c NUM"이 지정 되 지 않 았 을 때 기본 값 은 5000 줄 마다 리 셋 프로그램
  • 을 호출 합 니 다.
  • 리 셋 프로그램 은 주어진 줄 수 를 읽 은 후에 배열 요소 에 값 을 부여 하기 전에 실 행 됩 니 다.그래서 프로 세 스 는 "NUM 줄 읽 기 --> callback --> 할당"
  • 입 니 다.
  • 리 셋 함 수 를 호출 할 때마다 콜백 이전의 마지막 줄 데이터 와 대응 하 는 색인 번 호 를 리 셋 프로그램의 매개 변수 로 호출 합 니 다.예 를 들 어 -c 3 -C callback 는 색인 번호 2 와 3 줄 내용, 색인 번호 5 와 6 줄 내용 을 콜백 프로그램의 매개 변수
  • 로 한다.
  • "- t"는 줄 의 끝 구분 자 를 제거 하고 일반적으로 줄 바 꿈 자 입 니 다.다른 언어 로 프로 그래 밍 한 사람 은 줄 끝 에 줄 을 바 꾸 는 것 이 얼마나 번 거 로 운 지 알 지만 셸 프로 그래 밍 에 있어 서 는 괜 찮 습 니 다
  • 2. 몇 가지 예시 와 주의사항
    먼저 예제 에 사용 할 파일 alpha. log 를 만 듭 니 다. 줄 마다 소문 자 26 줄 입 니 다.
    $ echo {a..z} | tr " " "
    " >alpha.log $ cat alpha.log a b c d e f g h i j k l m n o p q r s t u v w x y z

    이 파일 을 읽 고 각 줄 을 배열 myarr 에 저장 합 니 다 (지정 하지 않 으 면 기본 MAPFILE 배열 에 저장 합 니 다).
    $ mapfile myarr 

    표준 입력 을 읽 는 이상 다음 과 같은 몇 가지 읽 기 형식 이 있 습 니 다.
    $ mapfile myarr 

    첫 번 째, 두 번 째 쓰 기 는 문제 가 없 지만 세 번 째 쓰 기 는 문제 가 있다.
    $ cat alpha.log | mapfile myarr1
    $ echo ${#myarr1[@]}
    0

    결과 에서 볼 수 있 듯 이 마 이 어 1 은 존재 하지 않 는 다.왜?나 는 셸 에서 while 순환 의 함정 에서 설명 을 한 적 이 있다.파이프 조합 에 대한 여러 명령 은 같은 프로 세 스 그룹 에 넣 고 하위 셸 에 들 어가 관련 작업 을 수행 합 니 다.실행 이 끝 난 후 프로 세 스 그룹 이 끝나 면 하위 셸 이 종 료 됩 니 다.한편, 하위 셸 에 설 치 된 환경 은 부모 셸 에 붙 지 않 기 때문에 my arr 1 배열 은 하위 셸 의 배열 이 고 부모 셸 로 돌아 가면 사라 집 니 다.
    해결 방법 은 하위 셸 에서 배열 을 조작 하 는 것 입 니 다.
    $ cat alpha.log | { mapfile myarr1;echo ${myarr1[@]}; }

    mapfile 은 몇 줄 을 읽 을 때마다 한 번 씩 실행 되 는 리 셋 함 수 를 지정 할 수 있 으 며, 리 셋 함 수 를 실행 할 때 읽 는 마지막 줄 과 해당 하 는 색인 번 호 를 리 셋 함수 에 추가 매개 변수 로 전달 합 니 다.
    간단 한 예제 입 니 다. 3 줄 을 읽 을 때마다 echo 를 실행 합 니 다. 아래 에 echo 에 전 달 된 매개 변수 값 을 주의 하 십시오.
    $ mapfile -c 3 -C "echo" myarr 

    여기 echo 가 바로 반전 함수 입 니 다.출력 결과 에서 한 번 실 행 될 때마다 빈 줄 이 있 습 니 다. 이것 은 파일 에 있 는 데이터 가 줄 로 나 뉘 어 있 고 echo 는 줄 바 꾸 기 기능 을 가지 고 있 기 때 문 입 니 다.따라서 '- t' 옵션 을 사용 하여 한 줄 을 읽 을 때마다 줄 바 꿈 자 를 지 울 수 있 습 니 다.
    $ mapfile -t -c 3 -C "echo" myarr 

    스 크 립 트 를 쓰 거나 함 수 를 리 셋 프로그램 으로 정의 하여 더욱 복잡 한 기능 을 실현 할 수 있 습 니 다. 그러나 mapfile 이 callback 에 전달 하 는 두 개의 매개 변 수 는 항상 마지막 두 개의 매개 변수 입 니 다.예 를 들 면:
    $ myecho(){ echo $@; };mapfile -t -c 3 -C "myecho haha" myarr 

    여러 작업 을 조합 하여 리 셋 프로그램 으로 사용 할 수 있 습 니 다.
    $ mapfile -t -c 3 -C "echo haha;echo" myarr

    좋은 웹페이지 즐겨찾기