다음과 비슷한 코드가 있습니다.
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
더 정확할 수 있습니다.