맵파일/readarray를 사용하는 방법

맵파일/readarray를 사용하는 방법

다음과 비슷한 코드가 있습니다.

while read -r col1 col2 col3 col4 col5 col6 col7 col8 TRASH; do 
        echo -e "${col1}\n${col2}\n${col3}\n${col4}\n${col5}\n${col6}\n"
done< <(ll | tail -n+2 | head -2)

(저는 실제로 ls/를 사용하지 않지만 ll이 편집된 예는 제가 겪고 있는 것과 동일한 문제를 보여준다고 생각합니다.)

문제는 실패할 경우 조건문이 필요해서 ll | tail -n+2 | head -2매핑 파일을 생성한 후 read스크립트를 통해 전달해 보았습니다. 지도 파일이 제대로 생성됐는데, 제대로 읽을 수 있도록 리디렉션하는 방법을 모르겠습니다.

암호

if ! mapfile -t TEST_ARR < <(ll | tail -n+2 | head -2); then
        exit 1
fi
while read -r col1 col2 col3 col4 col5 col6 col7 col8 TRASH; do 
        echo -e "${col1}\n${col2}\n${col3}\n${col4}\n${col5}\n${col6}\n"
done<<<"${TEST_ARR[@]}"

지도 파일 내용

declare -a TEST_ARR=(
        [0]="drwxr-xr-x@ 38 wheel   1.2K Dec  7 07:10 ./" 
        [1]="drwxr-xr-x  33 wheel   1.0K Jan 18 07:05 ../"
)

산출

$ while read -r col1 col2 col3 col4 col5 col6 col7 col8 TRASH; do
>             echo -e "${col1}\n${col2}\n${col3}\n${col4}\n${col5}\n${col6}\n"
>     done<<<"${TEST_ARR[@]}"
drwxr-xr-x@
38
wheel
1.2K
Dec
7

이 경우 문자열 리디렉션은 분명히 잘못된 것이지만 배열을 리디렉션하는 방법을 잘 모르겠습니다.

답변1

배열을 반복하면서 요소를 열로 읽어들이고 싶은 것 같습니다.

for ele in "${TEST_ARR[@]}"
do
  read -r col1 col2 col3 col4 col5 col6 col7 col8 TRASH <<< "$ele"
  echo -e "${col1}\n${col2}\n${col3}\n${col4}\n${col5}\n${col6}\n"
done

답변2

mapfile파일의 내용을 배열로 읽어서 "${array[@]}"할당과 같은 컨텍스트에서 사용하거나 단일 문자열만 사용하는 경우 <<<모든 배열 요소를 단일 문자열로 연결합니다 . 공백으로 연결되고 의 첫 번째 문자로 연결된다는 점을 "${array[*]}"제외하면 와 비슷합니다 .@*IFS

이제 "매핑 파일을 생성한다"고 하셨는데, 명령 이름을 그렇게 해석하면 안 될 것 같습니다. 파일을 배열에 "매핑"하는 것과 비슷합니다. (일부 언어처럼 양방향 지도가 아니라 복사본일 뿐입니다.) 대체 이름이 readarray더 정확할 수 있습니다.

관련 정보