Beklenmeyen belirteç `` 'yakınlarında sözdizimi hatası


11

Ubuntu terminalinde aşağıdaki kodu kullandığımda iyi çalışıyor:

rm !(*.sh) -rf

Ama aynı satır kodunu bir kabuk komut dosyasına (clean.sh) yerleştirir ve kabuk komut dosyasını terminalden çalıştırırsam, bir hata atar:

clean.sh betiği:

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

Aldığım hata:

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

Yardım edebilir misin?


Yanıtlar:


23

rm !(*.sh)Bir olan extglobaraçlar ettiklerim hariç tüm dosyaları kaldırmak sözdizimi .shuzantısı.

Etkileşimli bashörneğinizde, kabuk seçeneği extglobaçıktır:

$ shopt extglob 
extglob         on

Komut dosyanız bir alt kabukta çalıştığından, bunu extglobkomut dosyasının başına ekleyerek etkinleştirmeniz gerekir :

shopt -s extglob

Betiğiniz şöyle görünür:

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

DÜZENLE :

.shUzantılar dışındaki tüm dosyaları kaldırmak için şunu kullanın GLOBIGNORE(etkinleştirmek istemediğiniz için extglob):

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

Misal :

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

$ GLOBIGNORE='*.sh'

$ rm *

$ ls -1
bar.sh
foo.sh

bunu yapmadan aynı şeyi yapan komutumu değiştirebilir miyim? shopt -s extglob?
Tal

@Tal kontrollerimi kontrol et ..
heemayl

1
teşekkürler :) (yığın overflaw bana 15 karakter yazmamı sağladı :( :( :()
Tal

ama burada iki iyi cevap var!
Tal

1
Bu, kabul edilen cevap olmalıdır, çünkü aslında soruyu cevaplar, diğeri sadece bir geçici çözümü açıklar.
Guntram Blohm, Monica

4

Tamam, bu bir çapraz gönderi, ama bir cevap yazmam gerekiyor. ;)

Bunun findyerine kullanabilirsiniz

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

2

Açmanız gerekir extglob:

shopt -s extglob

1
@ Pilot6: Bkz man bash. Gibi uzun globbing sağlar !(...).
choroba

bunu yapmadan aynı şeyi yapan komutumu değiştirebilir miyim? shopt -s extglob
Tal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.