该模式有点不寻常,因为我添加了结尾的“?(。*)”部分。它可以按预期在命令行上运行,但是在脚本中出现相同语法错误。
$ bash --version
GNU bash, version 4.3.11(1)-release (i686-pc-linux-gnu)
...
$ cat x.sh
touch a.so a.so.1
ls *.so?(.*)
rm *.so?(.*)
$ touch a.so a.so.1
$ ls *.so?(.*)
a.so a.so.1
$ rm *.so?(.*)
$ ls
x.sh
$ bash x.sh
x.sh: line 2: syntax error near unexpected token `('
x.sh: line 2: `ls *.so?(.*)'
$
您正在使用扩展的glob,但默认情况下未在脚本中启用这些功能。为了使用它们,必须显式启用它们。您可以通过在行之前添加以下代码来做到这一点:
shopt -s extglob
要稍后在脚本中禁用它们,可以使用shopt -u extglob
。
正如chepner正确指出的那样,默认情况下,交互式外壳也未启用此功能。大概,此行出现在您的系统级启动脚本之一或您的个人脚本之一中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句