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

11

Quando uso o código abaixo no terminal Ubuntu, ele 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 do terminal, ele emitirá um erro:

Script clean.sh:

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

O erro que eu recebo:

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

você pode ajudar?

Tal
fonte

Respostas:

23

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

Na sua bashinstância interativa , a opção shell extglobestá ativada:

$ shopt extglob 
extglob         on

Agora, como seu script está sendo executado em um subshell, você precisa habilitá-lo extglobadicionando isso no início do script:

shopt -s extglob

Portanto, seu script se parece com:

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

EDIT:

Para remover todos os arquivos, exceto os de .shextensão, 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
heemail
fonte
posso mudar meu comando que faz o mesmo sem executar isso? shopt -s extglob?
Tal
@Tal verifique minhas edições ..
heemayl 4/15
1
obrigado :) (pilha overflaw me fazer escrever 15 caracteres no comentário :( :( :()
Tal
mas aqui tem duas boas respostas!
Tal
1
Essa deve ser a resposta aceita, pois ela realmente responde à pergunta, enquanto a outra apenas descreve uma solução alternativa.
Guntram Blohm apoia Monica
4

Ok, é um post cruzado, mas tenho que escrever uma resposta. ;)

Você poderia usar findem vez

find . -maxdepth 1 ! -name '*.sh' -exec rm -rf {} \;
AB
fonte
2

Você precisa ativar extglob:

shopt -s extglob
choroba
fonte
1
@ Pilot6: Veja man bash. Permite o globbing estendido como !(...).
choroba
posso mudar meu comando que faz o mesmo sem executar isso? shopt -s extglob
Tal