私のスクリプトは、空の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" )