意外令牌'('附近的语法错误


11

当我在Ubuntu终端中使用以下代码时,它可以正常工作:

rm !(*.sh) -rf

但是,如果我将相同的行代码放在外壳程序脚本(clean.sh)中并从终端运行外壳程序脚本,则会引发错误:

clean.sh脚本:

#!/bin/bash
rm !(*.sh) -rf

我得到的错误:

./clean.sh: line 2: syntax error near unexpected token `('
./clean.sh: line 2: `rm !(*.sh) -rf'

你能帮我吗?


Answers:


23

rm !(*.sh)是一种extglob语法,表示删除具有.sh扩展名的文件以外的所有文件。

在您的交互式bash实例中,shell选项extglob处于启用状态:

$ shopt extglob 
extglob         on

现在,当脚本在子外壳中运行时,您需要extglob通过在脚本开始处添加以下代码来启用该脚本:

shopt -s extglob

所以您的脚本看起来像:

#!/bin/bash
shopt -s extglob
rm -rf -- !(*.sh)

编辑:

要删除除.sh扩展名以外的所有文件,请使用GLOBIGNORE(因为您不想启用extglob):

#!/bin/bash
GLOBIGNORE='*.sh'
rm -rf *

范例:

$ ls -1
barbar
bar.sh
egg
foo.sh
spam

$ GLOBIGNORE='*.sh'

$ rm *

$ ls -1
bar.sh
foo.sh

我可以更改不执行此操作的命令吗?shopt -s extglob
2015年

@Tal检查我的编辑..
heemayl

1
谢谢:)(堆栈overflaw让我写评论:( 15字符:( :()
塔尔

但是这里有两个很好的答案!
2015年

1
这应该是公认的答案,因为它实际上回答了问题,而另一个只是描述了一种解决方法。
Guntram Blohm

4

好的,这是一个交叉发布,但是我必须写一个答案。;)

您可以find改用

find . -maxdepth 1 ! -name '*.sh' -exec rm -rf {} \;

2

您需要打开extglob

shopt -s extglob

1
@ Pilot6:参见man bash。它启用了扩展的globe这样的功能!(...)
choroba

我可以更改不执行此操作的命令吗?shopt -s extglob
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.