मैं कमांड में उद्धरण वाले बैश वैरिएबल (स्ट्रिंग) का उपयोग कैसे करूं?


45

असफल, सरलीकृत उदाहरण:

FLAGS='--archive --exclude="foo bar.txt"'
rsync $FLAGS dir1 dir2

मुझे उद्धरण शामिल करने की आवश्यकता है जैसे कि कमांड इस तरह थी:

rsync --archive --exclude="foo bar.txt" dir1 dir2

जवाबों:


55

संक्षिप्त उत्तर: BashFAQ # 50 देखें ("मैं एक चर में एक कमांड डालने की कोशिश कर रहा हूं, लेकिन जटिल मामले हमेशा विफल होते हैं!")।

दीर्घ उत्तर: आदेशों (या आदेशों के कुछ हिस्सों) को चर में डालना और फिर उन्हें वापस बाहर निकालना जटिल है। जब शेल कमांड लाइन पर एक चर का विस्तार करता है, यदि चर डबल-कोट्स में था तो इसे पार्स नहीं किया गया है; यदि यह उद्धरणों में नहीं था, तो तर्क विच्छेद के रूप में इसमें रिक्त स्थान होते हैं, लेकिन उद्धरण और पलायन पार्स नहीं होते हैं। या तो मामले में, चर के मूल्य में उद्धरण डालने से कुछ भी उपयोगी नहीं होता है।

आमतौर पर, इस तरह का काम करने का सबसे अच्छा तरीका एक साधारण पाठ चर के बजाय एक सरणी का उपयोग करना है:

FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2

पवित्र Jezus यह काम करता है!
स्लावोमिर


-2

मैं समस्या नहीं देखता:

$ FLAGS='--archive --exclude="foo bar.txt"'
$ echo $FLAGS
--archive --exclude="foo bar.txt"

शायद आपको फिर से मूल्य उद्धृत करने की आवश्यकता है:

$ rsync "$FLAGS" dir1 dir2

5
echoयह नहीं दिखा रहा है कि आपको क्या लगता है। printargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"यह देखने की कोशिश करें कि इनमें से कोई भी विकल्प क्यों काम नहीं करता है।
गॉर्डन डेविसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.