Arrays Bash:删除关联数组中的空项或缺少的项

Arrays Bash:删除关联数组中的空项或缺少的项,arrays,bash,associative-array,Arrays,Bash,Associative Array,我有一个关联数组,如下所示,Stackoverflow社区提供了一些有用的建议来构建数组,并让它们按照定义值的顺序运行。i、 e.磁盘按照定义的顺序进入“磁盘顺序” 一切都很顺利,直到我们遇到意想不到的事情。例如,如果一个条目为空(注意注释掉的行)。这把一切都抛了出去: #!/bin/bash localEndPoint="/tmp/test/" declare -A disks disks=([0-UUID]=a6506a2c844b40cc [0-MountPoi

我有一个关联数组,如下所示,Stackoverflow社区提供了一些有用的建议来构建数组,并让它们按照定义值的顺序运行。i、 e.磁盘按照定义的顺序进入“磁盘顺序”

一切都很顺利,直到我们遇到意想不到的事情。例如,如果一个条目为空(注意注释掉的行)。这把一切都抛了出去:

#!/bin/bash

localEndPoint="/tmp/test/"

declare -A disks

 disks=([0-UUID]=a6506a2c844b40cc [0-MountPoint]='/media/user/SomePath/')
disks+=([1-UUID]=a1f369ab35c5a22e [1-MountPoint]='/media/user/SomeOtherPath/')
disks+=([2-UUID]=6fd9ad56f4b94648 [2-MountPoint]='/media/user/AnotherOne/')
##disks+=([3-UUID]=aae8222d2ac131b0 [3-MountPoint]='/media/user/YetAnother/')  ## notice this line is commented out
disks+=([4-UUID]=0 [4-MountPoint]='/home/user/')
disks+=([5-UUID]=0 [5-MountPoint]='/home/user2/')


# build array so as to reflect the way it was defined above
# find total number of keys used and then use that for the division calculation (https://stackoverflow.com/questions/63532910)
declare -A keycount; for i in "${!disks[@]}"; do keycount[${i//[0-9]-/}]=""; done
totalDisks=$((${#disks[*]} / ${#keycount[@]}))
x=1; while [[ $x -le $totalDisks ]]; do disks_order+="$(( x-1 )) "; x=$(( $x + 1 )); done # 'disks_order' array is used to process which disks are handled in what order

# list everything
for i in ${disks_order[*]}; do
    diskLabel=$( basename "${disks[$i-MountPoint]}" )
    printf "Point $(( i+1 ))"
        if [[ "${disks[$i-UUID]}" == 0 ]]; then
            printf ": Path "
        else
            printf ": Disk "
        fi
    printf "${disks[$i-MountPoint]} to ${localEndPoint}${diskLabel}/\n"
done
实际产量 (注意第4点的空行和/home/user2的丢失)

期望输出 所以。如何按顺序删除空条目
磁盘

我想我们需要从这个答案中重新审视解决方案

i、 e


编辑:
totalDisks
需要显示数组中条目的总数,以便稍后在脚本中使用。

添加一个功能,添加可自动编号的光盘

declare -A disks
disks_add() {
   local n="$((${#disks[@]}/2))"
   disks+=([$n-UUID]="$1" [$n-MountPoint]="$2")
}
disks_add a6506a2c844b40cc '/media/user/SomePath/'
请记住使用检查脚本

但是我看不出你的设计有什么优势,只是你用那些
totalDisks
disk\u order
东西增加了复杂性。我将只使用两个数组:

disk_uuids=() disk_mountpoints=()
add_disk() { 
   # I am so lazy to type...
   disk_uuids+=("$1") 
   disk_mountpoints+=("$2")
}
add_disk a6506a2c844b40cc '/media/user/SomePath/'
# Who cares about indexes??
add_disk a1f369ab35c5a22e '/media/user/SomeOtherPath/'
add_disk 6fd9ad56f4b94648 '/media/user/AnotherOne/'

for ((i=0;i<${#disk_uuids[@]};++i)); do
    echo "Wow, so easy no sorting..."
    printf "%s\t%s\t%s\n" "$i" "${disk_uuids[i]}" "${disk_mountpoints[i]}"
done
disk_uuids=()disk_mountpoints=()
添加磁盘(){
#我懒得打字。。。
磁盘uuids+=(“$1”)
磁盘安装点+=(“$2”)
}
添加磁盘a6506a2c844b40cc'/media/user/SomePath/'
#谁在乎索引??
添加磁盘a1f369ab35c5a22e'/media/user/SomeOtherPath/'
添加磁盘6fd9ad56f4b94648'/media/user/AnotherOne/'

对于((i=0;i)您可以手动对元素进行编号?您没有想过自己进行编号吗?看起来(在我看来)您假设磁盘编号是连续的,但是只要您删除一个
磁盘[],这一点就会消失
assignments;在
for
循环之前添加
排版-p disks\u order
以查看数组的内容并查看它们是否匹配(按索引)你认为他们在那里做的方式很有见地。谢谢。请看我上面关于
totalDisks
的编辑。你能在你建议的这个数组构建中找到
totalDisks
吗?totalDisks
代表什么?你脚本中的这三行我完全看不懂。我们的总次数是多少完成
添加磁盘a1f36ab35c5a22e'/media/user/SomeOtherPath/'
添加磁盘6fd9ad56f4b94648'/media/user/AnotherOne/'/code>等行,这只是数组中元素的计数…..
${disk\uuids[@]}
如在循环中一样。或
${disk\uu挂载点[@}
对于另一个数组,它们将具有相同的元素计数。添加一个
disk\u cnt
变量并将其增加也没有什么错。
declare -A keycount; for i in "${!disks[@]}"; do keycount[${i//[0-9]-/}]=""; done
totalDisks=$((${#disks[*]} / ${#keycount[@]}))
x=1; while [[ $x -le $totalDisks ]]; do disks_order+="$(( x-1 )) "; x=$(( $x + 1 )); done
declare -A disks
disks_add() {
   local n="$((${#disks[@]}/2))"
   disks+=([$n-UUID]="$1" [$n-MountPoint]="$2")
}
disks_add a6506a2c844b40cc '/media/user/SomePath/'
disk_uuids=() disk_mountpoints=()
add_disk() { 
   # I am so lazy to type...
   disk_uuids+=("$1") 
   disk_mountpoints+=("$2")
}
add_disk a6506a2c844b40cc '/media/user/SomePath/'
# Who cares about indexes??
add_disk a1f369ab35c5a22e '/media/user/SomeOtherPath/'
add_disk 6fd9ad56f4b94648 '/media/user/AnotherOne/'

for ((i=0;i<${#disk_uuids[@]};++i)); do
    echo "Wow, so easy no sorting..."
    printf "%s\t%s\t%s\n" "$i" "${disk_uuids[i]}" "${disk_mountpoints[i]}"
done