अप्रत्याशित टोकन के पास सिंटैक्स त्रुटि `('


11

जब मैं उबंटू टर्मिनल में नीचे दिए गए कोड का उपयोग करता हूं, तो यह ठीक काम करता है:

rm !(*.sh) -rf

लेकिन अगर मैं एक ही लाइन कोड को शेल स्क्रिप्ट (clean.sh) में रखता हूं और शेल स्क्रिप्ट को टर्मिनल से चलाता हूं, तो यह एक त्रुटि फेंकता है:

clean.sh स्क्रिप्ट:

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

मुझे जो त्रुटि मिलती है:

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

क्या आप मदद कर सकते हैं?


जवाबों:


23

rm !(*.sh)एक extglobसिंटैक्स है, जिसका अर्थ है कि .shएक्सटेंशन वाली सभी फाइलों को हटा दें ।

आपके इंटरेक्टिव bashउदाहरण में, शेल विकल्प extglobचालू है:

$ shopt extglob 
extglob         on

अब जैसे आपकी स्क्रिप्ट एक सब-टाइम में चल रही है, आपको extglobइसे स्क्रिप्ट की शुरुआत में जोड़कर सक्षम करना होगा:

shopt -s extglob

तो आपकी स्क्रिप्ट इस तरह दिखती है:

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

संपादित करें:

.shएक्सटेंशन वाली GLOBIGNOREचीजों को छोड़कर सभी फाइलों को हटाने के लिए (जैसा कि आप सक्षम नहीं करना चाहते हैं extglob):

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

उदाहरण :

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

$ GLOBIGNORE='*.sh'

$ rm *

$ ls -1
bar.sh
foo.sh

क्या मैं अपनी कमांड को बदल सकता हूं जो इसे चलाने के बिना ही करता है? shopt -s extglob?
ताल

@ मेरे संपादनों की जाँच करें ..
heemayl 10

1
धन्यवाद :) (ढेर overflaw मुझे टिप्पणी में 15 चरित्र लिखने के लिए :( :( :()
ताल

लेकिन यहाँ एक दो अच्छे जवाब हैं!
ताल

1
यह स्वीकृत उत्तर होना चाहिए, क्योंकि यह वास्तव में प्रश्न का उत्तर देता है, जबकि दूसरा केवल एक वर्कअराउंड का वर्णन करता है।
गुंटराम ब्लोह

4

ठीक है, यह एक क्रॉस-पोस्ट है, लेकिन मुझे एक उत्तर लिखना होगा। ;)

आप findइसके बजाय उपयोग कर सकते हैं

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

2

आपको चालू extglobकरना होगा:

shopt -s extglob

1
@ पायलट 6: देखिए man bash। यह विस्तारित ग्लोबिंग की तरह सक्षम बनाता है !(...)
कोरोबा

क्या मैं अपनी कमांड को बदल सकता हूं जो इसे चलाने के बिना ही करता है? shopt -s extglob
ताल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.