내 스크립트는 빈 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" )
답변2
나머지 배열 요소를 0부터 시작하는 연속 인덱스로 축소하려면 배열 복사본을 만드는 것이 가장 쉽습니다.
arr1=(foo '' bar '')
arr2=()
for val in "${arr1[@]}"; do
[[ $val ]] && arr2+=( "$val" )
done
이렇게 하면 구멍이 남지 않도록 남아 있는 인덱스가 2 arr2
에서 1로 변경됩니다.declare -a arr2=([0]="foo" [1]="bar")
bar
개별 요소를 복제하고 마지막 요소의 설정을 해제하여 내부에서 이 작업을 수행할 수도 있지만 이는 수동 작업에 가깝습니다.