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