如何从函数参数输入创建数组变量——删除数组空白函数

How to create array-variable from function argument input -- Remove Array Blanks function

seeing this question 之后,我决定组合一个函数来删除数组的空元素,以防它节省一些人的时间。

有什么方法可以return(或导出)动态命名的输入数组变量作为函数的输出吗?

理想情况下

  1. 用户调用:removeArrayBlanks "newArrayName" "arrayItem1" "" "arrayItem2"...
  2. 该函数取消设置旧数组并创建:${newArrayName[@]},扩展为 "arrayItem1" "arrayItem2",没有任何空白项或非连续索引号

还有,有没有人有optimizations/suggestions这个功能?我已经包含了下面的功能。谢谢!

removeArrayBlanks() {
    # Usage: Provide array as input, store output as array. 
    # Example 1: mapfile -t lastArray < <(removeArrayBlanks "hate" "" "empty" "array" "items")
    # Example 2: mapfile -t lastArray < <(removeArrayBlanks "${inputArray[@]}")
    [[ $# -lt 2 ]] && echo "Usage: Provide array as an argument." && exit 1 # Ensure input is array
    tempArray=( "$@" ) # Rebuild array from inputs
    for i in "${!tempArray[@]}"; do
        [[ ! -z "${tempArray[$i]}" ]] && finalArray+=( "${tempArray[$i]}" ) # Add non-empty strings
    done && printf '%s\n' "${finalArray[@]}" && unset tempArray && unset finalArray
}

假设:

  • objective 是从当前数组
  • 中删除包含空字符串(又名'blanks')的数组元素
  • 函数应该能够处理传递给函数的任何数组(名称)
  • OP 是 运行,或者可以升级 to/above,bash 4.3+(需要 nameref 支持)

注意: 到 'remove' 数组元素只是 unset 数组引用(例如,unset array[index#1]

在函数和 unset 命令中使用 nameref 的一个想法:

function removeArrayBlanks() {

declare -n localarray=""                                  # define nameref; remains a local array variable

for i in "${!localarray[@]}"                                  # loop through indices
do
    [[ -z "${localarray[${i}]}" ]] && unset localarray[${i}]  # remove entries that contain empty strings
done
}

运行中:

$ myarray=( a "" 1 "" A )
$ typeset -p myarray
declare -a myarray=([0]="a" [1]="" [2]="1" [3]="" [4]="A")

$ removeArrayBlanks myarray
$ typeset -p myarray
declare -a myarray=([0]="a" [2]="1" [4]="A")

# verify localarray not known by parent
$ typeset -p localarray
-bash: typeset: localarray: not found