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
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1409066
Accepted
Red
Red
Asked: 2022-05-18 06:43:15 +0800 CST2022-05-18 06:43:15 +0800 CST 2022-05-18 06:43:15 +0800 CST

制作两个列表,匹配和不匹配特定文件类型

  • 772

我有一个 bash 函数,其中参数是文件。因此下面的打印语句给出

opts="$@"
echo "$fargs"

Result:
linge-cellar.rc linge-cellar.rc~ linge-checkn.rc linge-checkn.rc~ linge-comint.rc linge-comint.rc~ linge-comseq.rc linge-comseq.rc~ linge-console.rc linge-console.rc~ linge-curiplaya.rc linge-curiplaya.rc~ linge-dircolors.rc linge-dircolors.rc~ linge-firefly.rc linge-firefly.rc~ linge-mosaic.rc linge-mosaic.rc~ linge-profile.rc opcon-cellar.rc~

我有两个数组incl,excl它们存储要处理的文件类型。

Example: incl=( .rc )

我想列两个清单。一种文件与数组中的文件类型匹配的文件 incl(例如,带有.rc扩展名的文件)。另一个列表包含文件类型匹配失败的文件名(例如带有.rc~扩展名的文件)。

从一个简单的循环开始

  fargs="$@"
  local f ty aggr=()
  for f in $fargs; do
    for ty in "${incl[@]}"; do
      [[ "$f" =~ *${ty}$ ]] && aggr+=( "$f" )
    done
  done  

  echo "$fargs"

  echo
  echo "${incl[@]}"

  echo
  echo " aggr:"
  echo " ${aggr[*]}"
  

但是出了点问题,因为我总是得到一个空aggr数组。

dvorak linge-cellar.rc linge-cellar.rc~ linge-checkn.rc linge-checkn.rc~ linge-comint.rc linge-comint.rc~ linge-comseq.rc linge-comseq.rc~ linge-console.rc linge-console.rc~ linge-curiplaya.rc linge-curiplaya.rc~ linge-dircolors.rc linge-dircolors.rc~ linge-firefly.rc linge-firefly.rc~ linge-mosaic.rc linge-mosaic.rc~ linge-profile.rc opcon-cellar.rc~

.rc

 aggr:
bash
  • 1 1 个回答
  • 62 Views

1 个回答

  • Voted
  1. Best Answer
    steeldriver
    2022-05-18T09:14:30+08:002022-05-18T09:14:30+08:00

    主要问题是您将正则表达式语法($行锚)与全局模式语法(前导*通配符)混合在一起,您可以通过简单的测试来验证:

    $ ty=.rc; [[ foo.rc =~ *${ty}$ ]] ; echo $?
    2 
    

    (语法有效测试的退出状态应该是 0 或 1)。

    您的测试可以是

    [[ "$f" =~ ${ty}$ ]]    # regex
    

    或者

    [[ "$f" = *${ty} ]]     # glob pattern
    

    同样,fargs="$@"是一个标量赋值;您的未引用for f in $fargs然后将(字符串)变量拆分为空格 - 如果任何文件名包含空格,则会中断。你应该使用fargs=("$@")然后for f in "${fargs[@]}"。或者,直接遍历位置参数,for f in "$@"或者,POSIXLY,只是for f:

    #!/bin/bash
    
    myfunc () {
    
      local f ty aggr=()
      for f do
        for ty in "${incl[@]}"; do
          [[ "$f" = *${ty} ]] && aggr+=( "$f" )
        done
      done
    
      printf '%s\n' "${aggr[@]}"
    }
    
    incl=( .rc )
    
    myfunc linge-cellar.rc linge-cellar.rc~ linge-checkn.rc linge-checkn.rc~ \
           linge-comint.rc linge-comint.rc~ linge-comseq.rc linge-comseq.rc~ \
           linge-console.rc linge-console.rc~ linge-curiplaya.rc linge-curiplaya.rc~ \
           linge-dircolors.rc linge-dircolors.rc~ linge-firefly.rc linge-firefly.rc~ \
           linge-mosaic.rc linge-mosaic.rc~ linge-profile.rc opcon-cellar.rc~
    

    测试:

    $ ./myscript
    linge-cellar.rc
    linge-checkn.rc
    linge-comint.rc
    linge-comseq.rc
    linge-console.rc
    linge-curiplaya.rc
    linge-dircolors.rc
    linge-firefly.rc
    linge-mosaic.rc
    linge-profile.rc
    

    在 zsh 中,可以通过${name:#pattern}对位置参数数组应用参数扩展来避免内循环,使用M修饰符删除不匹配的元素(默认,不带M,删除匹配的元素):

    #!/bin/zsh
    
    myfunc () {
    
      local ty aggr=()
    
      for ty in ${incl[@]}; do
        aggr+=( ${(M)@:#*${ty}} )
      done
    
      print -rC1 ${aggr[@]}
    }
    

    看到这个类似的 Unix & Linux 答案是否有一种简单的方法来获取不以连字符开头的所有参数的数组?

    • 1

相关问题

  • 同时复制到两个位置

  • 如何在 shell 脚本中创建选择菜单?

  • 从 bash 迁移到 zsh [关闭]

  • bashrc 还是 bash_profile?

  • 备份 bash 脚本未压缩其 tarball

Sidebar

Stats

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

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve