web-dev-qa-db-fra.com

Puis-je faire une correspondance de modèle de nom de fichier dans un script bash?

Puis-je faire une correspondance de modèle de nom de fichier dans un script bash?

test est un répertoire avec les fichiers suivants ...

bob@bob-laptop:~/test$ ls  
exclude  exclude1  exclude2  include1  include2  

Depuis la ligne de commande, si je veux exclure certains fichiers, je peux le faire ...

bob@bob-laptop:~/test$ echo !(exclude*)  
include1 include2  

mais, si je mets cette commande dans un script (nommé exclude) ...

bob@bob-laptop:~/test$ cat exclude  
echo !(exclude*)  

quand je l'exécute, j'obtiens une erreur ...

bob@bob-laptop:~/test$ ./exclude  
./exclude: line 1: syntax error near unexpected token `('  
./exclude: line 1: `echo !(exclude*)'  

J'ai essayé toutes les variantes (je pense) d'échapper à certains, tous ou aucun des caractères spéciaux et je reçois toujours une erreur.

Qu'est-ce que j'oublie ici? Si je ne peux pas faire cela, est-ce que quelqu'un pourrait avoir la gentillesse d'expliquer pourquoi?

3
Bob Bowden

Vous devez mettre une ligne Shebang en haut du script. Sans ligne Shebang, le noyau ne sait pas que votre script doit être exécuté avec bash. Voir Le script shell échoue: erreur de syntaxe: “(” inattend

De plus, la syntaxe !(…) n'est pas activée par défaut, pour des raisons historiques (les versions antérieures de bash ne la prenaient pas en charge). Vous devez définir l'option extglob.

#!/bin/bash
shopt -s extglob
echo !(exclude*)
3
Gilles