Erro de sintaxe próximo ao token inesperado '('

11

Quando eu uso abaixo do código no terminal do Ubuntu, funciona bem:

rm !(*.sh) -rf

Mas se eu colocar o mesmo código de linha em um script de shell (clean.sh) e executar o script de shell no terminal, isso gerará um erro:

script clean.sh:

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

O erro que recebo:

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

você pode ajudar?

    
por Tal 04.08.2015 / 12:40

3 respostas

23

rm !(*.sh) é uma sintaxe extglob , o que significa remover todos os arquivos, exceto os que têm a extensão .sh .

Na sua instância interativa bash , a opção extglob do shell está ativada:

$ shopt extglob 
extglob         on

Agora que seu script está sendo executado em um subshell, é necessário ativar extglob adicionando isso no início do script:

shopt -s extglob

Assim, seu script parece:

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

EDITAR:

Para remover todos os arquivos, exceto .sh extension, use GLOBIGNORE (como você não deseja habilitar extglob ):

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

Exemplo:

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

$ GLOBIGNORE='*.sh'

$ rm *

$ ls -1
bar.sh
foo.sh
    
por heemayl 04.08.2015 / 12:48
4

Ok, é um cross-post, mas eu tenho que escrever uma resposta. ;)

Você pode usar find

find . -maxdepth 1 ! -name '*.sh' -exec rm -rf {} \;
    
por A.B. 04.08.2015 / 12:51
2

Você precisa transformar extglob em:

shopt -s extglob
    
por choroba 04.08.2015 / 12:43