2016-07-20 2 views
0

출력에서 ​​멋진 깔끔한 테이블을 만들려고합니다. 다음은 지금 작업하고있는 코드입니다 :Bash 4 연관 배열 생성

vmnumber=0 
declare -A vm_array=() 

for vm in $vms; do 
    declare vm_array[$vmnumber][cpu]="10" 
    echo "Test ${vm_array[$vmnumber][cpu]}" 
    declare vm_array[$vmnumber][memory]="20" 
    declare vm_array[$vmnumber][diskspace]="20" 
    vmnumber=$(($vmnumber + 1)) 
done 

# Table output 
for((i=0;i<$vmnumber;i++)); do 
    printf "%10s %10s %10s" vm_array[$i][cpu] vm_array[$i][memory] vm_array[$i][diskspace]" 
done 

에코가 작동하지 않고 변수 이름 만이 printf에 나와 있습니다.

이 값들 중 연관 배열을 어떻게 생성합니까?

+1

Bash는 다차원 배열 기간을 지원하지 않습니다. –

+0

BTW,'for vm in $ vms'는 여러분이 뭔가 잘못하고 있음을 나타냅니다. 'vms'을 배열로 정의했다면, 구문은'for vm in "$ {vms [@]}"'; 배열로 정의하지 않으므로 많은 버그가 발생하기 쉽습니다. 예를 들어,'*'항목이 있으면 현재 디렉토리의 파일 이름 목록으로 바뀝니다. ''guest machine ''이라는 항목이 있다면''guest''라는 이름의 VM과''machine ''이라고 이름 붙여진 VM으로 파싱됩니다. 필드 분리를 통해 문자열을 구성 요소로 분해하여 반복 할 때 전체적으로 오류가 발생하기 쉽습니다. 하지 마. –

답변

1

연관 배열은 숫자가 아닌 키를 지원합니다. 그들은 이 다차원이 아니며 값으로 다른 배열을 가질 수 없습니다. 은이 아닙니다.

vmnumber=0 
declare -A vm_data=() 

for vm in $vms; do ## aside: don't use for this way 
    vm_data[cpu_$vmnumber]="10" 
    vm_data[memory_$vmnumber]="20" 
    vm_data[diskspace_$vmnumber]="20" 
    ((++vmnumber)) 
done 

# test output 
declare -p vm_data 

# Table output 
for ((i=0; i<vmnumber; i++)); do 
    printf '%10s %10s %10s\n' "${vm_data[cpu_$i]}" "${vm_data[memory_$i]}" "${vm_data[diskspace_$i]}" 
done 
: 당신이 정말이 하나의 연관 배열을 원하는 경우

# Why this is this associative at all, if your keys are numeric? 
vmnumber=0 
vm_cpu=() vm_memory=() vm_diskspace=() 

for vm in $vms; do ## aside: don't use for this way 
    vm_cpu[$vmnumber]="10" 
    vm_memory[$vmnumber]="20" 
    vm_diskspace[$vmnumber]="20" 
    ((++vmnumber)) 
done 

# test output 
declare -p vm_cpu vm_memory vm_diskspace 

# Table output 
for i in "${!vm_cpu[@]}"; do # iterate over keys 
    printf '%10s %10s %10s\n' "${vm_cpu[$i]}" "${vm_memory[$i]}" "${vm_diskspace[$i]}" 
done 

, 즉 다음과 같습니다 다음과 같이 사용 사례를 들어, VM마다 별도의 비 연관 배열을 사용