Bash 4 生成关联数组

Bash 4 Generate Associative Array

我正在尝试从输出创建一个漂亮整洁的 table。这是现在可用的代码:

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

Echo 不工作,只有变量名出现在 printf 中。

如何从这些值中生成关联数组?

关联数组支持非数字键。它们 不是 多维的,并且不能将其他数组作为您的值。对于您的用例,每个 VM 使用单独的非关联数组,如下所示:

# 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

如果您真的想要一个单一的关联数组,它看起来像下面这样:

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