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

配列に空の要素が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

関連情報