Syntax error near unexpected token `('

Tal

When I use below code in Ubuntu terminal, it works fine:

rm !(*.sh) -rf

But if I place the same line code in a shell script (clean.sh) and run the shell script from terminal, it throws an error:

clean.sh script:

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

The error I get:

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

can you help?

heemayl

rm !(*.sh) is a extglob syntax which means remove all files except the ones that have the .sh extension.

In your interactive bash instance, the shell option extglob is on :

$ shopt extglob 
extglob         on

Now as your script is running in a subshell, you need to enable extglob by adding this at the start of the script :

shopt -s extglob

So your script looks like :

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

EDIT :

To remove all files except .sh extension ones use GLOBIGNORE (as you don't want to enable extglob) :

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

Example :

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

$ GLOBIGNORE='*.sh'

$ rm *

$ ls -1
bar.sh
foo.sh

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related