AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 411304
Accepted
bdesham
bdesham
Asked: 2017-12-17 11:48:20 +0800 CST2017-12-17 11:48:20 +0800 CST 2017-12-17 11:48:20 +0800 CST

如何检查 zsh 数组是否包含给定值?

  • 772

假设我有一个非关联数组,其定义如下

my_array=(foo bar baz)

如何检查数组是否包含给定的字符串?我更喜欢可以在if块的条件内使用的解决方案(例如if contains $my_array "something"; then ...)。

zsh
  • 2 2 个回答
  • 8888 Views

2 个回答

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2017-12-17T15:56:30+08:002017-12-17T15:56:30+08:00
    array=(foo bar baz foo)
    pattern=f*
    value=foo
    
    if (($array[(I)$pattern])); then
      echo array contains at least one value that matches the pattern
    fi
    
    if (($array[(Ie)$value])); then
      echo value is amongst the values of the array
    fi
    

    $array[(I)foo]如果未找到,则返回最后一次出现的fooin$array和 0 的索引。e标志是它是一个e精确匹配而不是模式匹配。

    要检查值$value的文字列表中的 is,您可以将该值列表传递给匿名函数并在函数体中查找$valuein $@:

    if ()(( $@[(Ie)$value] )) foo bar baz and some more; then
      echo "It's one of those"
    fi
    

    要知道在数组中找到值的次数,您可以使用${A:*B}运算符(A也位于数组中的数组元素B):

    array=(foo bar baz foo)
    value=foo
    search=("$value")
    (){print -r $# occurrence${2+s} of $value in array} "${(@)array:*search}"
    

    或者在数组元素上使用模式匹配:

    (){print -r $# occurrence${2+s} of $value in array} "${(M@)array:#$value}"
    
    • 37
  2. bdesham
    2017-12-17T12:15:13+08:002017-12-17T12:15:13+08:00

    如果您有一个数组$my_array并且想知道它是否包含字符串foo,则一种可能的测试是

    [[ ${my_array[(ie)foo]} -le ${#my_array} ]]
    

    数组元素的完整、精确值必须是foo; 它不是子字符串检查或类似的东西。

    如果要查看变量的值是否$my_string在数组中,请使用

    [[ ${my_array[(ie)$my_string]} -le ${#my_array} ]]
    

    这种(ie)语法不是很明显。ZSH 手册的下标标志部分对此进行了解释。这i部分意味着我们正在使用“反向下标”:而不是像往常一样传递一个下标并获得一个值,${my_array[1]}而是传递一个值并请求第一个给出该值的下标。这个下标是数字的并且从 1 开始(数组的第一个元素在索引 1 处),这与大多数编程语言使用的约定不同。ein(ie)表示我们想要精确匹配,而不需要扩展模式匹配字符,例如*.

    如果在数组中未找到该值,${my_array[(ie)foo]则将评估为数组末尾之后的第一个索引,因此对于 3 元素数组,它将返回 4。${#my_array}给出数组最后一个元素的索引,所以如果前者小于或等于后者,则给定值存在于数组中的某处。如果要检查给定值是否不在数组中,请将“小于或等于”更改为“大于”:

    [[ ${my_array[(ie)foo]} -gt ${#my_array} ]]
    
    • 28

相关问题

  • 列出没有其他后缀文件的文件

  • 什么情况下路径中最先找到的可执行文件不会被使用

  • 符号链接所有点文件和目录

  • 如何在`zsh`中增加一个动态命名的变量

  • 为什么我不能在 zsh 中定义一个名为 path 的只读变量?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    JSON数组使用jq来bash变量

    • 4 个回答
  • Marko Smith

    日期可以为 GMT 时区格式化当前时间吗?[复制]

    • 2 个回答
  • Marko Smith

    bash + 通过 bash 脚本从文件中读取变量和值

    • 4 个回答
  • Marko Smith

    如何复制目录并在同一命令中重命名它?

    • 4 个回答
  • Marko Smith

    ssh 连接。X11 连接因身份验证错误而被拒绝

    • 3 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Marko Smith

    systemctl 命令在 RHEL 6 中不起作用

    • 3 个回答
  • Marko Smith

    rsync 端口 22 和 873 使用

    • 2 个回答
  • Marko Smith

    以 100% 的利用率捕捉 /dev/loop -- 没有可用空间

    • 1 个回答
  • Marko Smith

    jq 打印子对象中所有的键和值

    • 2 个回答
  • Martin Hope
    EHerman JSON数组使用jq来bash变量 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux 日期可以为 GMT 时区格式化当前时间吗?[复制] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC 如何复制目录并在同一命令中重命名它? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve “root”用户的文件权限如何工作? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey 如何下载软件包而不是使用 apt-get 命令安装它? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao 为什么目录 /home、/usr、/var 等都具有相同的 inode 编号 (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg —list-keys 命令在将私钥导入全新安装后输出 uid [未知] 2017-11-26 18:26:02 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve