取消数组 bash 的空值

Har*_*uki 4 bash

我的脚本正在从 grep 结果设置数组,这样空的 grep 结果也存储在数组中。

例如。

set -x
echo "${Arr[@]}" 
+ echo '' 'word' '' 'word2'
Run Code Online (Sandbox Code Playgroud)

有人可以帮助取消设置这些空值,以便 echo "${#Arr[@]}" 给出 2 而不是 4

尝试过

var=-1 && for i in "${Input_Arr[@]}"; do var=$((var+1));  if [ -z "$i" ]; then unset "${Input_Arr[$var]}"; fi; done
Run Code Online (Sandbox Code Playgroud)

但它不起作用

ste*_*ver 6

首先,不需要发明虚拟索引 - 您可以使用间接运算符访问数组的索引!

其次,"${Input_Arr[$var]}"是元素的unset需要元素的nameInput_Arr[$var]或者只是Input_Arr[var],因为它已经是一个算术上下文)。所以给出:

$ arr=(foo '' bar '' baz)
$ declare -p arr
declare -a arr=([0]="foo" [1]="" [2]="bar" [3]="" [4]="baz")
Run Code Online (Sandbox Code Playgroud)

然后

$ for i in ${!arr[@]}; do [[ -z ${arr[i]} ]] && unset arr[i]; done
Run Code Online (Sandbox Code Playgroud)

树叶

$ declare -p arr
declare -a arr=([0]="foo" [2]="bar" [4]="baz")
Run Code Online (Sandbox Code Playgroud)

这也适用于关联数组 - 对非数字键进行适当的调整(包括双引号扩展以防止潜在的 split + glob):

$ declare -A Arr=(['1st val']=foo ['2nd val']='' ['3rd val']=bar ['4th val']='' ['5th val']=baz)

$ declare -p Arr
declare -A Arr=(["5th val"]="baz" ["2nd val"]="" ["4th val"]="" ["3rd val"]="bar" ["1st val"]="foo" )

$ for i in "${!Arr[@]}"; do [[ -z ${Arr[$i]} ]] && unset Arr["$i"]; done

$ declare -p Arr
declare -A Arr=(["5th val"]="baz" ["3rd val"]="bar" ["1st val"]="foo" )
Run Code Online (Sandbox Code Playgroud)