
각 항목에 공백이 있는 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
이것은 완전한 스크립트가 아니므로 이것이 명확하기를 바랍니다. "이거 괜찮네요" 주석이 있는 줄은 내가 원하는 것을 인쇄합니다. 내 샘플 데이터에서 "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
배열이나 해시가 임의로 깊게 중첩된 다른 배열 및/또는 해시를 포함할 수 있는 데이터 구조도 있습니다. 대부분의 다른 언어도 복잡한 데이터 구조를 가지고 있습니다.
그리고 마찬가지로 중요한 것은 쉘에서 발생하는 인용이나 단어 분리 문제가 없다는 것입니다.