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

Alb*_*ert 25 arrays zsh

例如

foo=(a b c)
Run Code Online (Sandbox Code Playgroud)

现在,我该怎么做一个简单的检查,如果b$foo

pax*_*blo 26

您可以使用反向订阅:

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
Run Code Online (Sandbox Code Playgroud)

你会发现man zshparam下面的数据Subscript Flags(至少在zsh 4.3.10下面Ubuntu 10.10).


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

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

您只需执行以下操作即可看到从这两个表达式中获得的内容:

pax$ echo ${foo[(i)a]} ${#foo}
1 3

pax$ echo ${foo[(i)b]} ${#foo}
2 3

pax$ echo ${foo[(i)c]} ${#foo}
3 3

pax$ echo ${foo[(i)d]} ${#foo}
4 3
Run Code Online (Sandbox Code Playgroud)

  • 另外:`if(($ {foo [(i)b]} <= $ {#foo}))` (3认同)
  • 或者:`if(($ {+ foo [(r)b]})); 然后 ; 回声是; 别的 回声不; fi` (3认同)
  • 在数组中有空字符串的情况下,`(i)`修饰符可能更有用:它返回匹配的索引,可以与`$ {#foo}`进行比较. (2认同)

blu*_*yed 19

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


Jum*_*unk 5

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

$ 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.
Run Code Online (Sandbox Code Playgroud)