변수 집합이 있고 해당 변수가 정의되었는지 테스트하고 정의되지 않은 변수가 있으면 조건을 설정한다고 가정해 보겠습니다.
다음과 같이 진행하려고 합니다.
#!/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]
일치하는 마지막 요소의 인덱스를 반환합니다.pattern
0
또는 다음을 사용하여 빈 요소의 수를 계산할 수 있습니다.
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