変数セットがあり、その変数が定義されているかどうかをテストし、未定義の変数がある場合は条件を設定するとします。
次のように進めようとしています。
#!/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
配列に空の要素が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