如何在传递给“bash -c”的命令中使用带括号的扩展 glob?

如何在传递给“bash -c”的命令中使用带括号的扩展 glob?

我正在尝试使用扩展的 glob bash -c,但还没有找到让它工作的方法。

我尝试过的事情

  1. bash -c 'for f in *.!(ext); do echo $f; done'

    结果:

    bash: -c: line 0: syntax error near unexpected token `('
    

     

  2. bash -c 'for f in *.!\(ext\); do echo $f; done'

    结果:

    *.!(ext)
    

     

  3. bash -c 'for f in *.!$0; do echo $f; done' '(ext)'

    结果:

    *.!(ext)
    

     

  4. bash -c 'for f in "*.!(ext)"; do echo $f; done'

    结果:

    *.!(ext)
    

答案1

要在 中使用扩展的通配模式bash,您必须extglob以一种或另一种方式启用 shell 选项。

对于内联脚本执行此操作的最简单方法是使用命令行上的选项bash -c设置 shell 选项:-O

bash -O extglob -c 'script code here'

您也可以直接致电shopt -s extglob 在脚本内,但您必须确保这是在单独的行上完成的,因为它改变了 shell 解析代码的方式(它修改了 shell 的语法):

bash -c 'shopt -s extglob
         script code here'

至于打印所有不以字符串结尾的名称的实际任务.ext

bash -O extglob -O dotglob -O nullglob -c 'printf "%s\n" !(*.ext)'

通过另外设置dotglobnullglob选项,脚本将匹配隐藏名称,如果没有匹配,将打印一个空行(而不是打印未展开的模式)。

请注意,您的模式将排除以(不仅仅是)*.!(ext)结尾的文件名ext.ext不包含点的文件名。

相关内容