【问题标题】:Bash extended globbing brackets break array initalizationBash 扩展的 globbing 括号会破坏数组初始化
【发布时间】:2015-05-10 09:20:50
【问题描述】:

我使用语句echo *([!min]).css 来获取当前目录中所有扩展名为.css 的文件名,除了扩展名为.min.css 的文件名。这对 bash 有效。

但是,当我使用它在 bash 脚本中初始化数组时

files=(*([!min]).css)

它不再起作用了。 Bash 说某处有一个意外的左括号。我的编辑器的语法突出显示也看起来像数组初始化中 glob 的括号不正确,但是我无法正确处理。

有什么建议吗?谢谢。

编辑:我在 ArchLinux 上使用 GNU Bash 4.3.033。

【问题讨论】:

  • files=*([!min]).css ?
  • @Cyrus 不,同样的错误。
  • files=$((*([!min]).css)) 试试这个??
  • @Cyrus:路径名扩展不在(非数组)变量赋值的 RHS 上执行。

标签: arrays bash glob


【解决方案1】:

要使用extended globs,您必须启用 extglob shell 选项。将它放在脚本的开头,就在 shebang 下方:

#!/usr/bin/env bash
shopt -s extglob
#...
files=( !(*.min).css )
#...

请注意,shell 选项不是继承的,因此即使您可能在运行脚本的交互式 bash 中启用了 extglob,您仍然必须在脚本中显式启用它。

【讨论】:

  • 我已经解释过 glob 本身在 bash 中的脚本之外工作,所以这不是问题。
  • @nsommer,这只是意味着您在交互式会话中启用了它(可能通过 bash-completion)。默认情况下它被禁用,这就是它在您的脚本中不起作用的原因。
  • 感谢您做对了;我建议您添加陷阱 re extglob potentially 由于初始化文件而在 interactive shells 中启用,而不是在 scripts 中启用,答案本身。
  • @geirha 感谢您如此耐心,看来您是对的。实际上,我确实尝试在脚本中启用 extglobs,但在此之前没有正确执行。我猜这是以前 glob 本身的问题,在最新编辑后使用您的示例时,一切正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
  • 2012-11-13
相关资源
最近更新 更多