意外标记“(”附近的语法错误

意外标记“(”附近的语法错误

当我在 Ubuntu 终端中使用以下代码时,它运行良好:

rm !(*.sh) -rf

但是如果我将同一行代码放在 shell 脚本(clean.sh)中并从终端运行该 shell 脚本,它会引发错误:

clean.sh脚本:

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

我收到的错误:

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

你能帮我吗?

答案1

rm !(*.sh)是一种extglob语法,意思是删除除具有扩展名的文件之外的所有文件.sh

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

$ shopt extglob 
extglob         on

现在,由于你的脚本正在子 shell 中运行,你需要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

答案2

好的,这是一条交叉帖子,但我必须写一个答案。;)

你可以find使用

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

答案3

您需要打开extglob

shopt -s extglob

相关内容