2013-04-02 5 views
5

मैं एक चर कि स्ट्रिंग के इस प्रकार शामिल है:वाइल्डकार्ड का विस्तार किये बिना मैं बैश वैरिएबल में चर का विस्तार कैसे करूं?

var='$FOO/bar/baz*' 

और मैं अपनी सामग्री से चर $ FOO बदलना चाहते हैं। हालांकि, जब मैं करना

var=$(eval "echo $var") 

चर बदल दिया जाता है, लेकिन स्टार भी बदल दिया जाता है ताकि var अब मेरी फाइल सिस्टम में हर संभव मैच होता है (के रूप में अगर मैं एक खोल में टैब दबाया)। उदाहरण के लिए, यदि $ FOO में/home है, var में "/home/bar/baz1.sh /home/bar/baz2.sh /home/bar/baz.conf"

मैं वाइल्डकार्ड का विस्तार किए बिना चर को कैसे बदलूं?

+0

यह भी देखें http://mywiki.wooledge.org/TemplateFiles –

+0

यदि आपका लक्ष्य केवल ग्लोबिंग अक्षम करना है, तो 'set -f' ऐसा करेगा। यदि आपका लक्ष्य सुरक्षित टेम्पलेट मूल्यांकन करना है ... अच्छा, बैश में टेम्पलेट्स के बारे में _safe_ कुछ भी नहीं है, क्योंकि आप कमांड प्रतिस्थापन को अक्षम नहीं कर सकते हैं; यानी, '$ (आरएम-आरएफ "$ HOME") वाला एक टेम्पलेट, बस यही करेगा। –

उत्तर

5

बैश में ग्लोबिंग बंद करें, फिर इसे पुन: सक्षम करें।

set -f 
var="$FOO/bar/baz*" 
set +f 
1

बस उद्धरण ड्रॉप:

var=$FOO/bar/baz/* 

Globs एक चर असाइनमेंट की आरएचएस पर विस्तार नहीं कर रहे हैं।

+0

मैं क्रिंग करता हूं जैसा कि मैंने सुझाव दिया है, लेकिन इसके बारे में: 'var = '$ FOO/bar/baz *'; eval "expandedvar = $ var" '(चेतावनी: 'eval' चीजों को गलत होने के कई तरीकों के लिए दरवाजा खोलता है, यह भी मजाकिया नहीं है)। –

+0

मुझे यकीन नहीं है कि क्यों 'eval' आवश्यक है। मेरे जवाब में, 'var' का मान "whateverwasinfoo/bar/baz/*" होगा। परिवर्तनीय '$ FOO' का विस्तार किया गया है, स्टार नहीं है। क्या मैं इस सवाल को गलत समझ रहा हूं? – chepner

+0

मेरी समझ यह थी कि उसके पास पहले से ही एक चर सेट '$ FOO/bar/baz *' (या कुछ समान) है, न कि स्क्रिप्ट में उस स्ट्रिंग को सीधे शामिल किया जाएगा। –

संबंधित मुद्दे