web-dev-qa-db-fra.com

Erreur de syntaxe près du jeton inattendu `('

Lorsque j'utilise le code ci-dessous dans un terminal Ubuntu, cela fonctionne bien:

rm !(*.sh) -rf

Mais si je place le même code de ligne dans un script Shell (clean.sh) et que je lance le script Shell à partir du terminal, une erreur se produit:

script clean.sh:

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

L'erreur que je reçois:

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

pouvez-vous aider?

11
Tal

rm !(*.sh) est une syntaxe extglobqui signifie supprimer tous les fichiers, sauf ceux portant l'extension .sh.

Dans votre instance interactive bashname__, l'option Shell extglobest activée:

$ shopt extglob 
extglob         on

Maintenant que votre script est exécuté dans un sous-shell, vous devez activer extgloben l'ajoutant au début du script:

shopt -s extglob

Donc, votre script ressemble à:

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

EDIT:

Pour supprimer tous les fichiers sauf ceux de l'extension .sh, utilisez GLOBIGNORE(car vous ne voulez pas activer extglobname__):

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

Exemple:

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

$ GLOBIGNORE='*.sh'

$ rm *

$ ls -1
bar.sh
foo.sh
23
heemayl

Ok, c'est un post-cross, mais je dois écrire une réponse. ;)

Vous pouvez utiliser find à la place

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

Vous devez activer extglob:

shopt -s extglob
2
choroba