Arrays zsh:检查字符串是否在数组中

Arrays zsh:检查字符串是否在数组中,arrays,zsh,Arrays,Zsh,例如 现在,如何轻松检查b是否在$foo中?您可以使用反向订阅: foo=(a b c) 您可以在下标标志下的manzshparam下找到数据ils(至少在zsh4.3.10下的ubuntu10.10) 或者(为此感谢),您可以使用: pax$ foo=(a b c) pax$ if [[ ${foo[(r)b]} == b ]] ; then ; echo yes ; else ; echo no ; fi yes pax$ if [[ ${foo[(r)x]} == x ]] ; t

例如


现在,如何轻松检查
b
是否在
$foo
中?

您可以使用反向订阅:

foo=(a b c)
您可以在
下标标志下的
manzshparam
下找到数据ils(至少在
zsh4.3.10
下的
ubuntu10.10


或者(为此感谢),您可以使用:

pax$ foo=(a b c)

pax$ if [[ ${foo[(r)b]} == b ]] ; then ; echo yes ; else ; echo no ; fi
yes

pax$ if [[ ${foo[(r)x]} == x ]] ; then ; echo yes ; else ; echo no ; fi
no
您只需执行以下操作,即可从这两个表达式中看到您所得到的结果:

pax$ if [[ ${foo[(i)b]} -le ${#foo} ]] ; then ; echo yes ; else ; echo no ; fi

如果找到匹配项,则反向下标将始终返回某些内容,如果未找到匹配项,则反向下标将不返回任何内容。我们可以用它来进一步简化答案

(( ${foo[(I)b]} )) \
  && echo "it's in" \
  || echo "it's somewhere else maybe"

当数组中有空字符串时,
(i)
修饰符可能更有用:它返回匹配的索引,可以与
${{foo}
进行比较。另外:
if(${foo[(i)b]}或:
if(${+foo[(r)b]}));然后;echo yes;else;echo no;fi
@drumfire FYI当从创建数组时,该方法似乎失败。您需要明确
(r)
下标标志需要一个模式。
foo=(abc'a(b)c');bar=$foo[2];echo${foo[(r)$bar]}
将打印
abc
,而不是
a(b)c
。如果您不希望
(r)
下标标志的输入被解释为一种模式(可能更可能),因此不希望被这种模式所捕获,那么您还需要
(e)
下标标志:
${foo[(re)$bar]}
。这是如此简洁和优雅-当计算表达式为0时,zsh算术计算返回状态为1,否则返回状态为1。非常有用的习惯用法+1M
(( ${foo[(I)b]} )) \
  && echo "it's in" \
  || echo "it's somewhere else maybe"
$ foo=(a b c)

$ [[ -n "${foo[(r)b]}" ]] && echo 'b was found.' || echo 'b was not found.'
b was found.

$ [[ -n "${foo[(r)d]}" ]] && echo 'd was found.' || echo 'd was not found.'
d was not found.