ধরে নিচ্ছি আপনার বিভাজক হিসাবে স্পেসগুলির সাথে একটি স্ট্রিং রয়েছে:
newline_separated=${space_separated// /$'\n'}
তবে আপনি সম্ভবত ভুল প্রশ্ন জিজ্ঞাসা করছেন। (অগত্যা নয়, উদাহরণস্বরূপ এটি একটি মেকফিলের মধ্যে উপস্থিত হতে পারে)) ফাইলের নামের একটি পৃথক পৃথকীকরণের তালিকাটি আসলেই কাজ করে না: যদি ফাইলের নামের কোনওটিতে ফাঁকা স্থান থাকে?
যদি কোনও প্রোগ্রাম আর্গুমেন্ট হিসাবে ফাইলের নামগুলি গ্রহণ করে তবে স্পেসে তাদের সাথে যোগদান করবেন না। ব্যবহার করুন "$@"
এক তাদের এক অ্যাক্সেস করতে। যদিও echo "$@"
এর মধ্যে ফাঁক দিয়ে আর্গুমেন্টগুলি মুদ্রণ করে, কারণ এটি echo
: এটি পৃথক পৃথক হিসাবে স্পেস দিয়ে তার যুক্তিগুলি মুদ্রণ করে। somecommand "$@"
কমান্ডের পৃথক যুক্তি হিসাবে ফাইলের নামগুলি পাস করে। আপনি যদি পৃথক লাইনে যুক্তিগুলি মুদ্রণ করতে চান তবে আপনি ব্যবহার করতে পারেন
printf '%s\n' "$@"
যদি আপনার কাছে স্পেস-বিভাজিত ফাইলের নাম থাকে এবং এগুলি কাজ করার জন্য আপনি এগুলিতে একটি অ্যারে রাখতে চান তবে আপনি অক্ষরগুলিতে মানটি বিভক্ত করতে একটি অব্যক্ত ভেরিয়েবল প্রসারণ ব্যবহার করতে পারেন IFS
( set -f
অন্যথায় গ্লোব সহ আপনার ওয়াইল্ডকার্ড সম্প্রসারণ অক্ষম করতে হবে) নিদর্শনগুলিতে প্রসারিত হবে):
space_separated_list='/path/to/file1 /path/to/file2 /path/to/file3'
IFS=' '; set -f
eval "array=(\$space_separated_list)"
for x in "${array[@]}"; do …
আপনি এটিকে কোনও ফাংশনে আবদ্ধ করতে পারেন যা সেটি -f
হয়ে IFS
গেলে এবং এর মানটি পুনরুদ্ধার করে :
split_list () {
local IFS=' ' flags='+f'
if [[ $- = *f* ]]; then flags=; fi
set -f
eval "$1=($2)"
set $flags
}
split_list array '/path/to/file1 /path/to/file2 /path/to/file3'
for x in "${array[@]}"; do …