Kesalahan sintaksis dekat token yang tidak terduga `('

11

Ketika saya menggunakan kode di bawah ini di terminal Ubuntu, itu berfungsi dengan baik:

rm !(*.sh) -rf

Tetapi jika saya menempatkan kode baris yang sama dalam skrip shell (clean.sh) dan menjalankan skrip shell dari terminal, itu melemparkan kesalahan:

skrip clean.sh:

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

Kesalahan yang saya dapatkan:

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

Bisakah kamu menolong?

Tal
sumber

Jawaban:

23

rm !(*.sh)adalah extglobsintaks yang berarti menghapus semua file kecuali yang memiliki .shekstensi.

Dalam bashinstance interaktif Anda , opsi shell extglobaktif:

$ shopt extglob 
extglob         on

Sekarang saat skrip Anda berjalan dalam subkulit, Anda harus mengaktifkannya extglobdengan menambahkan ini di awal skrip:

shopt -s extglob

Jadi skrip Anda terlihat seperti:

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

EDIT:

Untuk menghapus semua file kecuali yang .shekstensi gunakan GLOBIGNORE(karena Anda tidak ingin mengaktifkan extglob):

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

Contoh:

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

$ GLOBIGNORE='*.sh'

$ rm *

$ ls -1
bar.sh
foo.sh
heemayl
sumber
dapatkah saya mengubah perintah saya yang melakukan hal yang sama tanpa menjalankan ini? shopt -s extglob?
Tal
@Tal cek suntingan saya ..
heemayl
1
terima kasih :) (stack overflaw membuat saya menulis 15 karakter dalam komentar :( :( :()
Tal
tapi di sini ada dua jawaban bagus!
Tal
1
Ini harus menjadi jawaban yang diterima, karena itu sebenarnya menjawab pertanyaan, sementara yang lain hanya menggambarkan solusi.
Guntram Blohm mendukung Monica
4

Ok, ini postingan silang, tetapi saya harus menulis jawaban. ;)

Anda bisa menggunakannya findsebagai gantinya

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

Anda harus menghidupkan extglob:

shopt -s extglob
choroba
sumber
1
@ Pilot6: Lihat man bash. Ini memungkinkan globbing diperpanjang seperti !(...).
choroba
dapatkah saya mengubah perintah saya yang melakukan hal yang sama tanpa menjalankan ini? shopt -s extglob
Tal