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 / 问题 / 697001
Accepted
markling
markling
Asked: 2022-03-28 06:51:20 +0800 CST2022-03-28 06:51:20 +0800 CST 2022-03-28 06:51:20 +0800 CST

使用可选的带括号的参数查找

  • 772

如何添加可选的分组参数列表来查找?

例如,使用一组基本参数来定义将始终找到的文件,而不管指定了哪些其他变量条件。

# args to find any files ending _count or _scan

._. fargs=( -type f -name '*_count' -o -name '*_scan' )
._. cd /sys/fs/ext4/sda1
._. find . \( "${fargs[@]}" \) 2> /dev/null
./mb_min_to_scan
./errors_count
./mb_max_to_scan
./msg_count
./warning_count

添加可选的附加参数

._. fpterm=warning
._. fpterm2=max
._. fANDargs=( -ipath "*$fpterm*" -o -ipath "*$fpterm2*" )

应用括号中的可选参数以使用以下形式执行查找:( a 或 b 或 c )和( d 或 e 或 f )

._. find . \( "${fargs[@]}" \) \( "${fANDargs[@]}" \) 2> /dev/null
./dm-1/mb_max_to_scan
./dm-1/warning_count
./dm-0/mb_max_to_scan
./dm-0/warning_count
./sda1/mb_max_to_scan
./sda1/warning_count

但是当可选的 arg 数组为空时,它会停止满足其他条件,并且根本找不到文件:

._. fANDargs=()
._. find . \( "${fargs[@]}" \) \( "${fANDargs[@]}" \) 2> /dev/null
._. 

空括号导致问题:

._. find . \( "${fargs[@]}" \) \( \) 2> /dev/null
._.

而通常,一个空的 arg 数组不会阻止满足其他条件:

._. fANDargs=()   
._. echo "${fANDargs[@]}"

._. find . \( "${fargs[@]}" \) "${fANDargs[@]}" 2> /dev/null
...
./sda1/mb_min_to_scan
./sda1/errors_count
./sda1/mb_max_to_scan
./sda1/msg_count
./sda1/warning_count

因此,如果仅当可选 args 数组不为空时才可以添加方括号,则该命令可能会起作用。

但是如何有条件地添加括号呢?

将括号添加到数组时似乎不起作用,例如:

._. fpterm=warning
._. fANDargs=()
._. [ ! -z $fpterm ] && fANDargs+=( '\(' -ipath "*$fpterm*" '\)' )
._. echo "${fANDargs[@]}"
\( -ipath *warning* \)
._. find . \( "${fargs[@]}" \) "${fANDargs[@]}" 2> /dev/null
._.
bash find
  • 1 1 个回答
  • 30 Views

1 个回答

  • Voted
  1. Best Answer
    ilkkachu
    2022-03-28T07:04:19+08:002022-03-28T07:04:19+08:00
    [ ! -z $fpterm ] && fANDargs+=( '\(' -ipath "*$fpterm*" '\)' )
    

    你在这里双引号。尝试仅一层:

    fANDargs+=( \(  -ipath "*$fpterm*" \)  )   # or  
    fANDargs+=( '(' -ipath "*$fpterm*" ')' )   # or with "(" and ")"
    

    (你也应该在 中使用引号[ ! -z "$fpterm" ])

    通常,您在数组赋值中使用单词的方式与在命令中直接使用它们的方式完全相同。与引号一起使用"${array[@]}"(如您所做的那样)将扩展为数组的内容而无需进一步修改。

    (这是人们似乎经常出错的部分,他们似乎期望 shell 处理扩展结果的引号。事实并非如此,它更像是这里的“普通”编程语言。只要你使用引号来获取摆脱分裂+球的滋扰。)

    当然,这里的背景是,find它本身想要看到的只是原样的括号(作为不同的参数)。它不需要看到引号,但shell需要它们,因为括号是特殊字符,是 shell 语法的一部分。所以你可以somecmd { foo bar }不带引号使用,但你确实需要在somecmd \( foo bar \).


    顺便说一句,GNU find 警告一组空括号:

    $ find . \( \)
    find: invalid expression; empty parentheses are not allowed.
    

    而且,好吧,从逻辑上讲,无论如何这似乎很奇怪。我的第一直觉是说空括号必须评估为虚假,这将find \( whatever \) \( \)永远不匹配。但它也可以被解释为真实的,这似乎是 Busybox 所做busybox find . \( \) -name '*.txt'的,与busybox find . -name '*.txt'.

    • 3

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

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

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +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