Posso fazer correspondência de padrões de nomes de arquivos em um script bash?

3

Posso fazer correspondência de padrão de nome de arquivo em um script bash?

test é um diretório com os seguintes arquivos ...

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

Na linha de comando, se eu quiser excluir alguns dos arquivos, pode fazer ...

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

mas, se eu colocar esse comando em um script (chamado exclude ) ...

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

quando eu o executo, recebo um erro ...

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

Eu tentei cada (eu acho) variação de escapar de alguns, todos ou nenhum dos caracteres especiais e ainda recebo um erro.

O que estou perdendo aqui? Se eu não posso fazer isso, alguém por favor, seja gentil a ponto de explicar por quê?

    
por Bob Bowden 25.10.2012 / 23:11

1 resposta

3

Você precisa colocar uma linha shebang na parte superior do script. Sem uma linha shebang, o kernel não sabe que seu script deve ser executado com o bash. Consulte O script da shell falha: Erro de sintaxe: “(” inesperado

Além disso, a sintaxe !(…) não está ativada por padrão, por motivos históricos (versões anteriores do bash não ofereciam suporte). Você precisa definir a opção extglob .

#!/bin/bash
shopt -s extglob
echo !(exclude*)
    
por Gilles 26.10.2012 / 01:54

Tags