在bash脚本中无法使用模式匹配!("file1")
,但可以在命令行中使用。
例如:
ls !("file1"|"file2")
这将列出目录中除file1
和file2
以外的所有文件。
在脚本中执行该行时,将显示此错误:
./script.sh: line 1: syntax error near unexpected token `('
./script.sh: line 1: ` ls !("file1"|"file2") '
无论使用什么rm -v !("file1")
。发生相同的错误。这是怎么回事,为什么这在脚本中不起作用?
答案 0 :(得分:12)
您尝试使用的扩展glob语法在默认情况下处于关闭状态;您必须在每个要使用它的脚本中分别启用它。
shopt -s extglob
Scripts should not use ls
,尽管我想您在这里只是将其用作占位符。
答案 1 :(得分:5)
除非您启用extglob
shell opt,否则无法使用globbing。相反,我建议使用find
:
find . -maxdepth 1 -not -name '<NAME>' -or -name '<NAME>' -delete
在使用-delete
运行此命令之前,请确保输出正确
答案 2 :(得分:3)
具有默认设置且没有外部过程的方法:
for f in *; do [[ $f =~ ^file[12]$ ]] || echo "$f"; done