Zsh의 배열. 다음 변수가 정의되지 않았는지 확인하십시오.

Zsh의 배열. 다음 변수가 정의되지 않았는지 확인하십시오.

변수 집합이 있고 해당 변수가 정의되었는지 테스트하고 정의되지 않은 변수가 있으면 조건을 설정한다고 가정해 보겠습니다.

다음과 같이 진행하려고 합니다.

#!/usr/bin/env zsh
d=("$VAR1" "$VAR2" "$VAR3")    
for x in $d;
do
    if <variable_x_not_defined>
       UNDEFINED_VARIABLES="True"
    fi
done

<variable_x_not_defined>다양한 조건부 옵션을 테스트했지만 운이 좋지 않았습니다. 여기서 배열을 올바르게 사용하고 있습니까? Zsh에서 이 작업을 어떻게 수행할 수 있나요?

답변1

배열에 빈 요소가 하나 이상 포함되어 있는지 확인하려면 다음을 수행할 수 있습니다.

if ((i = array[(I)])); then
  echo "array contains at least one empty element (${i}th)"
else
  echo "array doesn't contain empty elements"
fi

찾을 수 없는 경우 (I)또는 와 $array[(I)pattern]일치하는 마지막 요소의 인덱스를 반환합니다.pattern0

또는 다음을 사용하여 빈 요소의 수를 계산할 수 있습니다.

if ((n = ${(M)#array[@]:#})); then
  echo "array contains $n empty elements"
else
  echo "array doesn't contain any empty element"
fi

${(M)array[@]:#pattern}일치하는 요소로 확장됩니다 pattern. 개수를 얻으 려면 추가하세요 #.

답변2

for x in $d빈 문자열을 건너뛰는 것을 확인했습니다 .

VAR1=a
VAR2=
VAR3=c
d=("$VAR1" "$VAR2" "$VAR3")
for x in $d; do
    echo $x
done

a
c

a(와 사이에 빈 줄이 누락되어 있음에 유의하세요 c)

bash 및 ksh 호환 배열 확장을 사용하면 "${d[@]}"문제가 해결되는 것 같습니다.

VAR1=a
VAR2=
VAR3=c
d=("$VAR1" "$VAR2" "$VAR3")
for x in "${d[@]}"; do
    echo $x
done

a

c

따라서 스크립트는 다음을 수행할 수 있습니다.

#!/usr/bin/env zsh
d=("$VAR1" "$VAR2" "$VAR3")
undefined_variables=false
for x in "${d[@]}"; do
    if [[ -z "${x}" ]]; then
        undefined_variables=true
        break
    fi
done
if $undefined_variables; then
    echo "Found some undefined variables"
fi

또한 양식에서는 옵션이 설정되지 않았다고 for x in $d가정 하지만 이것이 항상 정확하지는 않을 수도 있습니다.KSH_ARRAYS


또는 배열을 다음과 같이 설정할 수 있습니다.이름값 대신 변수를 사용하고 루프 내에서 "nameref"를 사용하십시오. 이렇게 하면 참조가 더 간단해지고 어떤 변수가 설정되지 않았는지 확인할 수 있습니다.

#!/usr/bin/env zsh
VAR1=a
VAR2=b
VAR3=
vars=(VAR1 VAR2 VAR3)
undefined_variables=false
for var in $vars; do        # or 'for var in "${vars[@]}"' if KSH_ARRAYS might be on
    if [[ -z "${(P)var}" ]]; then
        echo "$var is empty"
        undefined_variables=true
    fi
    # alternatively to test for defined variable as opposed to empty:
    if ((! ${(P)+var})); then
        echo "$var is not set"
        undefined_variables=true
    fi
done

관련 정보