我可以在 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*)