উত্তর:
দেখে মনে হচ্ছে ব্যাশ উত্পন্ন শব্দগুলিতে যোগ দিতে $ আইএফএস ব্যবহার করে না। আরেকটি কৌশল একটি অ্যারের মধ্যে উত্পন্ন শব্দ এবং তারপর $ 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} )"