zsh は間接拡張によって連想配列のキーが存在するかどうかをテストします。

zsh は間接拡張によって連想配列のキーが存在するかどうかをテストします。

したがって、次のように間接拡張によって一般パラメータの有無をテストできることがわかります。

foo=1
bar=foo
(( ${(P)+bar} )) && print "$bar exists"

以下を実行して、連想配列にキーが存在するかどうかをテストできることを知っています。

foo=([abc]=1)
(( ${+foo[abc]} )) && print "abc exists"

しかし、2つを組み合わせて、間接拡張によってキーが連想配列に存在するかどうかをテストする方法はわかりません。 evalを使用しないことは可能ですか?

以下を含むいくつかの組み合わせを試しましたが、そのうち何も機能しません。

foo=([abc]=1)
bar=foo
(( ${(P)+bar[abc]} )) && print "$bar has key abc" # Test fails
(( ${(P)+${bar}[abc]} )) && print "$bar has key abc" # Passes for nonexistant keys
(( ${${(P)+bar}[abc]} )) && print "$bar has key abc" # Test fails
(( ${${(P)bar}+[abc]} )) && print "$bar has key abc" # prints "zsh: bad output format specification"

ベストアンサー1

いいえここで議論してください。値の渡しを防ぐには、${:-word}他のパラメータ拡張(たとえば)で正しい形式の文字列を使用してから、次のように拡張する必要があります${(P)+...}

(( ${(P)+${:-${bar}[abc]}} )) && print OK || print FAIL

おすすめ記事