如何从函数参数输入创建数组变量——删除数组空白函数
How to create array-variable from function argument input -- Remove Array Blanks function
在 seeing this question 之后,我决定组合一个函数来删除数组的空元素,以防它节省一些人的时间。
有什么方法可以return(或导出)动态命名的输入数组变量作为函数的输出吗?
理想情况下
- 用户调用:
removeArrayBlanks "newArrayName" "arrayItem1" "" "arrayItem2"...
- 该函数取消设置旧数组并创建:
${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
在 seeing this question 之后,我决定组合一个函数来删除数组的空元素,以防它节省一些人的时间。
有什么方法可以return(或导出)动态命名的输入数组变量作为函数的输出吗?
理想情况下
- 用户调用:
removeArrayBlanks "newArrayName" "arrayItem1" "" "arrayItem2"...
- 该函数取消设置旧数组并创建:
${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 是从当前数组 中删除包含空字符串(又名
- 函数应该能够处理传递给函数的任何数组(名称)
- OP 是 运行,或者可以升级 to/above,
bash 4.3+
(需要nameref
支持)
'blanks'
)的数组元素
注意: 到 '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