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?


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

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 {} \;

2

Anda harus menghidupkan extglob:

shopt -s extglob

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.