我可以在 Bash 脚本中进行文件名模式匹配吗?

我可以在 Bash 脚本中进行文件名模式匹配吗?

我可以在 Bash 脚本中进行文件名模式匹配吗?

test是一个包含以下文件的目录...

bob@bob-laptop:~/test$ ls  
exclude  exclude1  exclude2  include1  include2  

从命令行,如果我想排除某些文件,我可以执行...

bob@bob-laptop:~/test$ echo !(exclude*)  
include1 include2  

但是,如果我将该命令放入脚本(名为exclude)中......

bob@bob-laptop:~/test$ cat exclude  
echo !(exclude*)  

当我执行它时,出现错误...

bob@bob-laptop:~/test$ ./exclude  
./exclude: line 1: syntax error near unexpected token `('  
./exclude: line 1: `echo !(exclude*)'  

我已经尝试了每一种(我认为)方法来转义部分、全部或不转义任何特殊字符,但仍然出现错误。

我这里遗漏了什么?如果我做不到这一点,有人能解释一下原因吗?

答案1

你需要放一个舍邦脚本顶部的行。如果没有 shebang 行,内核就不知道你的脚本必须用 bash 执行。请参阅Shell 脚本失败:语法错误:“(”意外

此外,!(…)由于历史原因(早期版本的 bash 不支持该语法),默认情况下不启用该语法。您需要设置该extglob选项。

#!/bin/bash
shopt -s extglob
echo !(exclude*)

相关内容