Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Testing whether a string matches any pattern from a list
- X-seq: zsh-users 30109
- From: Peter Stephenson <p.w.stephenson@xxxxxxxxxxxx>
- To: zsh-users@xxxxxxx
- Subject: Re: Testing whether a string matches any pattern from a list
- Date: Fri, 15 Nov 2024 10:29:52 +0000 (GMT)
- Archived-at: <https://zsh.org/users/30109>
- Importance: Normal
- In-reply-to: <CAGdYchuk6nmJcORxZaNxrbjXWm6=XrqS0qNgdgoEqSJwEnxzGw@mail.gmail.com>
- List-id: <zsh-users.zsh.org>
- References: <CAGdYchuk6nmJcORxZaNxrbjXWm6=XrqS0qNgdgoEqSJwEnxzGw@mail.gmail.com>
> On 15/11/2024 00:12 GMT Philippe Altherr <philippe.altherr@xxxxxxxxx>
> wrote: I have an array that contains a list of patterns and a
> string. I would like to check whether the string matches any of the
> patterns in the array. For example if patterns=("foo*" "*bar"), then a
> test for "foob", "obar", and "foobar" should return true and one for
> "ooba" should return false.
>
> I hoped that I could use the following:
>
> if [[ -v patterns[(k)$string] ]]; then ... fi;
>
> Unfortunately, the pattern matching effect of the subscript flag
> (https://zsh.sourceforge.io/Doc/Release/Parameters.html#Subscript-Flags) (k)
> only works for associative arrays, not for regular arrays.
I think you might be hitting a slightly different problem, that the test
is taking place in a special context that doesn't do the pattern lookup.
This is rather obscure so probably not intentional.
At least, the following does work for me (and doesn't
seem to be dependent on any options I have):
% string=B\*
% print $signals[(k)$string]
BUS
See if this works:
local lookup=${patterns[(k)$string]}
if [[ -n $lookup ]]; then
# ...
fi
pws
Messages sorted by:
Reverse Date,
Date,
Thread,
Author