공백이 포함된 문자열로 bash 배열을 채우고 다음과 같은 배열에서 항목을 읽습니다.

공백이 포함된 문자열로 bash 배열을 채우고 다음과 같은 배열에서 항목을 읽습니다.

각 항목에 공백이 있는 Bash 배열을 채우는 방법을 논의하는 여러 기사를 읽었습니다. 나는 성공했다고 믿습니다.

내가 해야 할 일은 루프에서 이 작업을 수행하여 각 반복의 모든 배열 내용으로 더 큰 배열을 채우는 것입니다.

그래서 다른 스크립트에서 얻은 배열 항목을 반복하는 외부 루프가 있습니다. 이 루프를 반복할 때마다 여러 줄의 출력을 생성하는 명령줄을 실행하고 각 줄이 배열 항목이 되도록 합니다. 이러한 배열 항목을 모두 "요약" 배열에 추가해야 합니다. "이 배열의 내용을 다른 배열에 추가"하는 방법을 모르기 때문에 더 작은 배열을 반복해야 할 것 같습니다. 지금까지는 이것이 내가 필요한 일을 하고 있습니다. 그러나 더 큰 배열에 추가하면 제대로 작동하지 않는 것 같습니다. 이 작업을 수행한 후 더 큰 배열에 추가하고 더 큰 배열의 길이를 확인하면 항상 "1"입니다.

스크립트의 관련 부분은 다음과 같습니다.

nslist=$(...)
pnarray=()
for ns in $nslist; do
    IFS=$'\n' nspnarray=($(...))
    echo "nspnarray.len[${#nspnarray[@]}]" # This looks fine
    for pn in ${nspnarray[@]}; do
        echo "pn[$pn]" # This looks fine
        IFS=$'\n' pnarray+=$pn # Something wrong with this?
        echo "pnarray.len[${#pnarray[@]}]" # is always 1
    done
done

이것은 완전한 스크립트가 아니므로 명확해지기를 바랍니다. "This looking good"이라는 주석이 있는 줄에 내가 원하는 내용이 인쇄됩니다. 내 예제 데이터에서 "nspnarray" 할당에서 호출한 명령줄은 5줄의 출력을 생성했고 "nspnarray.len" 인쇄 문은 "5"를 표시했습니다.

그런 다음 5개 항목을 각각 반복하여 인쇄합니다. 아직 괜찮아 보이는데요. 예상한 대로 공백이 포함된 값을 인쇄합니다. 그런 다음 이를 "요약" 배열에 할당한 다음 요약 배열의 길이를 인쇄하려고 시도하면 항상 "1"이 인쇄됩니다. "이게 왜 문제야?" 과제를 잘못한 것 같아요. 철사.

답변1

하나의 배열을 다른 배열에 추가하는 것은 매우 간단합니다.

$ a=(1 2 3)
$ b=(4 5 6)
$ a+=("${b[@]}")
$ typeset -p a
declare -a a=([0]="1" [1]="2" [2]="3" [3]="4" [4]="5" [5]="6")

그러나 배열을 사용하여 상대적으로 복잡한 작업을 수행하는 경우 해당 작업에 더 적합한 언어를 사용해야 합니다. awk또는 perl예를 들어. 또는 python. 또는 bash나 다른 쉘을 제외한 거의 모든 것.

셸은 작업을 수행하거나 데이터를 처리하기 위해 다른 프로그램의 실행(다른 프로그램으로의 파이프, stdin 및 stdout 리디렉션 등)의 실행을 조정하는 데 적합합니다. 본질적으로 이러한 다른 작업을 수행하는 데 능숙하지는 않습니다. 실제로는 형편 없습니다.

awk다차원 배열(인덱싱 및 연관)이 있을 perl뿐만 아니라 배열이나 해시가 임의의 깊이에 중첩된 다른 배열 및/또는 해시를 포함할 수 있는 데이터 구조도 있습니다. 대부분의 다른 언어도 복잡한 데이터 구조를 가지고 있습니다.

그리고 마찬가지로 중요한 것은 쉘이 가지고 있는 인용이나 단어 분할 문제로 고통받지 않는다는 것입니다.

관련 정보