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?
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*)