mapfile을 사용하여 값을 읽을 때 bash 배열이 올바르게 처리되지 않습니다.

mapfile을 사용하여 값을 읽을 때 bash 배열이 올바르게 처리되지 않습니다.

이것은 나를 혼란스럽게 한다.

bash 배열 로딩에는 두 가지 버전이 있는데, 하나는 작동하고 다른 하나는 작동하지 않습니다.

스크립트에서 배열을 명시적으로 초기화하면 정상적으로 작동합니다.

zz=( 1 26 32 54 71 13 30 43 52 73 7 23 42 57 61 15 27 35 56 66 5 20 36 51 68 )

#print in reverse
for i in {24..0}
do
        echo "zz[$i] is ${zz[$i]}"
done

출력은 예상대로입니다.

zz[24] is 68
zz[23] is 51
zz[22] is 36
zz[21] is 20
zz[20] is 5
zz[19] is 66
zz[18] is 56
zz[17] is 35
zz[16] is 27
zz[15] is 15
zz[14] is 61
zz[13] is 57
zz[12] is 42
zz[11] is 23
zz[10] is 7
zz[9] is 73
zz[8] is 52
zz[7] is 43
zz[6] is 30
zz[5] is 13
zz[4] is 71
zz[3] is 54
zz[2] is 32
zz[1] is 26
zz[0] is 1

이 버전은 (아직) 작동하지 않습니다:

# cat your_data
1 26 32 54 71 13 30 43 52 73 7 23 42 57 61 15 27 35 56 66 5 20 36 51 68
mapfile -t zz < your_data

#print in reverse
for i in {24..0}
do
        echo "zz[$i] is ${zz[$i]}"
done


Output:
zz[24] is
zz[23] is
zz[22] is
zz[21] is
zz[20] is
zz[19] is
zz[18] is
zz[17] is
zz[16] is
zz[15] is
zz[14] is
zz[13] is
zz[12] is
zz[11] is
zz[10] is
zz[9] is
zz[8] is
zz[7] is
zz[6] is
zz[5] is
zz[4] is
zz[3] is
zz[2] is
zz[1] is
zz[0] is 1 26 32 54 71 13 30 43 52 73 7 23 42 57 61 15 27 35 56 66 5 20 36 51 68

따라서 mapfile을 통해 데이터를 읽어오면 모든 데이터가 zz[0]에 채워지게 됩니다. IFS를 명시적으로 공백("")으로만 설정한 경우에도 마찬가지입니다. 나는 이것이 어느 시점에서 작동했다고 확신하므로 아마도 이것이 내 환경에서도 작동할 것입니다. 혼란스러워요 ...

고마워요, 스낵스타드

답변1

mapfile명령은 파일을 한 줄씩 읽습니다. 즉, 파일이 로 끝날 것으로 예상합니다 \n. 데이터가 공백으로 구분되므로 파일의 이 (유일한) 줄은 단일 토큰으로 처리되므로 첫 번째 배열 위치에 할당됩니다. 다음과 같이 입력 파일을 변경해 보십시오.

1
26
32

...

68

트릭이 있어야합니다.

답변2

모든 데이터가 파일에서 공백으로 구분된 한 줄에 있는 경우 다음을 수행합니다.

read -r -a arrayname < filename

-a가 여기서 핵심입니다. 파일에서 한 줄을 읽고 $IFS를 기준으로 분할한 다음 필드를 배열에 저장합니다.

이미 지적했듯이 mapfile은 파일을 다음과 같이 분할합니다.철사어쩔 수 없지성격.

관련 정보