配列 bash の null 値を取り消す

配列 bash の null 値を取り消す

私のスクリプトは、空のgrep結果も配列に格納されるようにgrep結果の配列を設定します。

例えば。

set -x
echo "${Arr[@]}" 
+ echo '' 'word' '' 'word2'

echo "${#Arr[@]}" が 4 ではなく 2 を提供するように、誰かがこれらの null 値を設定解除するのに役立ちますか?

試験を終えた

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

しかし、うまくいきません

ベストアンサー1

まず、仮想インデックスを作成する必要はありません。間接演算子を使用して配列のインデックスにアクセスできます。!

第二に、"${Input_Arr[$var]}"要素的です;unset要素が必要です。名前Input_Arr[$var]または単にすでにInput_Arr[var]算術コンテキストだからです)。だから与えられた:

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

それから

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

$ declare -p arr
declare -a arr=([0]="foo" [2]="bar" [4]="baz")

これは、数値ではなくキーを適切に調整することで連想配列でも機能します(潜在的な分割+グローブを防ぐための二重引用符拡張を含む)。

$ 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" )

おすすめ記事