2013-06-14 22 views
7

में बैश शब्द विभाजन को रोकें मैं बैश को एक सबस्ट्रिंग के भीतर विभाजित शब्दों से कैसे रोक सकता हूं? यहाँ समस्या को वर्णन करने के कुछ हद तक एक काल्पनिक उदाहरण है:सबस्ट्रिंग

touch file1 'foo bar' 
FILES="file1 'foo bar'" 
ls -la $FILES 

यह प्रभावी रूप से समान व्यवहार में परिणाम होगा कि 'foo बार' द्वारा ls $ फ़ाइलों के भीतर आदेश एक एकल स्ट्रिंग के रूप में माना पाने के लिए संभव है के रूप में निम्नलिखित आदेश?

files=(file1 'foo bar') 
ls -la "${files[@]}" 
+3

आप नहीं कर सकते करने के लिए सेट कर सकते हैं IFS पेश करने के लिए। [एक सरणी का उपयोग करें] (http://mywiki.wooledge.org/BashFAQ/050) के रूप में kojiro सुझाव देता है। दिखाए गए सटीक वाक्यविन्यास का प्रयोग करें, उद्धरण महत्वपूर्ण हैं। –

उत्तर

14

एक सरणी का उपयोग करें। बस एक और विकल्प आप सफेद स्थान से एक अलग क्षेत्र विभाजक के साथ FILES में फ़ाइलों की अपनी सूची की दुकान और उस क्षेत्र विभाजक

OLDIFS=$IFS 
FILES="file1:foo bar" 
IFS=':'; ls -la $FILES 
IFS=$OLDIFS 
+0

धन्यवाद। संदर्भ वास्तव में ऐसा है कि मेरे पास एक बैश स्क्रिप्ट (s1.sh) है जिसमें से मैं एक और स्क्रिप्ट (s2.sh) कह रहा हूं। s2.sh बदले में बाइनरी कमांड cmd का आह्वान करता है और तर्क के रूप में CMD_OPTS पर्यावरण चर के मान को पास करता है। तो अधिमानतः, मैं s1.sh में वास्तव में s2.sh को संशोधित किए बिना CMD_OPTS सेट करने में सक्षम होना चाहता हूं। – marko

+2

@marko: संभव नहीं है - आपको 's2.sh' को ठीक करना होगा। साथ ही, सुनिश्चित करें कि स्क्रिप्ट वास्तव में 'बाश' स्क्रिप्ट हैं और '/ bin/sh' स्क्रिप्ट नहीं हैं - POSIX खोल सरणी का समर्थन नहीं करता है। –

+1

@ रिचर्ड-हैंनसेन: ठीक है, धन्यवाद। – marko

2

Kojiro के सरणी यहाँ समाधान सबसे अच्छा विकल्प है:

ls -la file1 'foo bar' 
संबंधित मुद्दे