जवाबों:
ऐसा लगता है कि बैश उत्पन्न शब्दों में शामिल होने के लिए $ IFS का उपयोग नहीं करता है। एक और तकनीक एक सरणी में उत्पन्न शब्दों को संग्रहीत करने के लिए होगी और फिर $ IFS खेल में होगी :
मैं एक सबशेल का उपयोग करने जा रहा हूं, इसलिए मैं इस शेल के IFS में परिवर्तन नहीं करता: एक का चयन करें
( words=( a{b,c,d} ); IFS=,; echo "${words[*]}" )
( set -- a{b,c,d}; IFS=,; echo "$*" )
यह कॉमा को अलग करता है स्ट्रिंग को स्टडआउट में। यदि आप इसे कैप्चर करना चाहते हैं:
joined=$( set -- a{b,c,d}; IFS=,; echo "$*" )
मुझे यकीन है कि इसे पूरा करने के कई तरीके हैं। यहाँ एक विधि है:
echo a{b,c,d} | sed 's/ /,/g'
आपके द्वारा दिखाए गए तत्वों का विस्तार करें और फिर उन पर लूप करें, सभी अल्पविराम को जोड़ते हुए पहला पुनरावृत्ति:
for i in a{b,c,d}; do
u="${u:+$u, }$i"
done
echo "$u"
परिणाम:
ab, ac, ad
बैश पैरामीटर प्रतिस्थापन देखें ।
यहाँ एक बैश-केवल समाधान है।
(IN=$(echo a{b,c,d}); echo ${IN// /,})
# ab,ac,ad
अर्धविराम से पहले का हिस्सा ab ac ad
वैरिएबल को असाइन करता है IN
और दूसरा भाग सर्च का उपयोग करता है और सभी स्पेस को कॉमा में बदल देता है। //
सभी मैचों का मतलब सिर्फ पहले नहीं है।
अपने नामस्थान को प्रदूषित न करने के लिए यह सब एक सब-सब्सक्रिप्शन (एनकोडिंग कोष्ठक) में करें।
यह ध्यान देने योग्य है कि कई संदर्भों में, एक अनुगामी अल्पविराम ऐसी सूची में स्वीकार्य है। यदि एक अनुगामी अल्पविराम स्वीकार्य है, तो प्रतिस्थापन को संभालने का सबसे आसान तरीका है printf
:
some-command "$(printf %s, a{b,c,d} )"
(जहां some-command
एक कमांड है जो अल्पविराम से अलग की गई सूची पर चलती है, और अनुगामी अल्पविराम की परवाह नहीं करती है।)
वास्तव में, भले ही आपके पास अनुगामी अल्पविराम न हो, जिसका आप उपयोग कर सकते हैं printf
; आपको केवल उन तर्कों की संख्या निर्दिष्ट करने की आवश्यकता है जो आप अपेक्षा करते हैं, जो इसे बहुत लंबी सूची के लिए अनाड़ी बनाता है:
some-command "$(printf %s,%s,%s a{b,c,d} )"