Bash脚本和正则表达式问题

Tho*_*ard 7 regex linux bash ubuntu-12.04

让我们想象一下,在我的服务器上,我有以下文件:

foo@bar:/var/log/foo$ ls
fooFile1 fooFile2 logFile logFile.1 logFile.2
Run Code Online (Sandbox Code Playgroud)

我想创建一个包含每个文件的存档,但是logFile.*.所以我想出了命令:

foo@bar:~$ tar -czf foo.tar.gz /var/log/foo/!(logFile.*)

它工作正常!但是,在尝试创建执行相同工作的脚本时:

#!/bin/bash

tar -czf foo.tar.gz /var/log/foo/!(logFile.*)
Run Code Online (Sandbox Code Playgroud)

我遇到了以下错误:

./test.sh: line 3: syntax error near unexpected token '('
./test.sh: line 3: 'tar -czf foo.tar.gz /var/log/foo/!(logFile.*)'
Run Code Online (Sandbox Code Playgroud)

这个问题与tar无关(我遇到了同样的问题ls而不是tar)

我不明白这个错误来自哪里.谁能告诉我哪里错了?

在Ubuntu 12.04上遇到过

anu*_*ava 7

将这条线放在shebang下面:

shopt -s extglob
Run Code Online (Sandbox Code Playgroud)

在脚本中启用扩展的glob选项.

!(logFile.*) 是扩展的glob模式,需要启用 extglob

  • 值得明确指出,此选项在交互式shell中默认启用,这是导致行为差异的原因. (4认同)