Тестирование на наличие ключа в ассоциативном массиве с помощью косвенного расширения в zsh - PullRequest
0 голосов
/ 24 января 2020

Итак, я знаю, что вы можете проверить наличие обычного параметра через косвенное расширение, выполнив что-то вроде:

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

И я знаю, что вы можете проверить наличие ключа внутри ассоциативного массива делая что-то вроде:

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

Однако я не могу понять, как объединить два и проверить наличие ключа внутри ассоциативного массива посредством косвенного расширения. Возможно ли это без использования 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"
...