模式匹配在 bash 脚本中不起作用
Posted
技术标签:
【中文标题】模式匹配在 bash 脚本中不起作用【英文标题】:Pattern match does not work in bash script 【发布时间】:2019-08-28 00:38:36 【问题描述】:使用模式匹配!("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")
。发生同样的错误。这是怎么回事,为什么这在脚本中不起作用?
【问题讨论】:
How can I use inverse or negative wildcards when pattern matching in a unix/linux shell?、List all files that do not match pattern using ls等可能重复。相关的是Why would I not leave extglob enabled in bash? 使用source script.sh
运行它
【参考方案1】:
默认情况下,您尝试使用的扩展 glob 语法已关闭;您必须在要使用它的每个脚本中单独启用它。
shopt -s extglob
Scripts should not use ls
虽然我想你只是在这里用作占位符。
【讨论】:
【参考方案2】:除非您启用extglob
shell opt,否则通配符不起作用。相反,我建议使用find
:
find . -maxdepth 1 -not -name '<NAME>' -or -name '<NAME>' -delete
在使用-delete
运行此命令之前,请确保输出正确
【讨论】:
【参考方案3】:具有默认设置且没有外部过程的方法:
for f in *; do [[ $f =~ ^file[12]$ ]] || echo "$f"; done
【讨论】:
以上是关于模式匹配在 bash 脚本中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
lockfile-create 在 bash 脚本中不起作用