【问题标题】:Pattern matching in UNIX Case statementUNIX Case 语句中的模式匹配
【发布时间】:2017-08-06 10:18:21
【问题描述】:

我正在使用一个 shell 脚本,我需要在其中区分 tar.gzgz|bz 等。

我首先提取文件的扩展名,然后尝试使用case 匹配它,我的第一个案例是*tar*,它应该匹配扩展名中带有tar 的文件,因为它们可以用相同的命令。

问题是我试图匹配 gz bz2 等的下一组语句。我需要一个匹配 bzgz2 的 case 模式,但同时也检查没有tar 在扩展中。

我对 shell 模式匹配一​​无所知,写了这个[!(tar).*(bz2|bz)$](请不要笑)

任何帮助将不胜感激。

【问题讨论】:

  • $ 是正则表达式语法,*tar* 是 glob (shell) 语法。 case 使用 glob 语法。为了在 glob 中使用!,您必须启用extglob。为什么要用括号?
  • @LaurentG 我不知道如何继续。尝试混合正则表达式,失败。

标签: linux bash shell unix pattern-matching


【解决方案1】:

case 按顺序处理,所以如果你先查找tar 文件,它不应该转到下一个:

case "${word}" in
  *.tar* )
    #process tar
    :;; #break
  *.bz2|*.bz )
    #process bz2 and bz
    :;; #break
  * )
    #default
    :;;
esac

【讨论】:

  • 正确,: 只是总是true 语句,这是为了避免丢失命令的错误......不确定它是否真的相关。
  • 感谢您的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 2020-04-19
  • 2018-09-04
  • 2010-12-06
  • 1970-01-01
  • 2023-02-07
  • 2021-04-26
相关资源
最近更新 更多