আমার একটি বাশ শেল স্ক্রিপ্ট রয়েছে যা একটি নির্দিষ্ট ডিরেক্টরিতে সমস্ত শিশু ডিরেক্টরিতে (তবে ফাইল নয়) লুপ করে। সমস্যাটি হ'ল কিছু ডিরেক্টরি নামের শূন্যস্থান রয়েছে।
এখানে আমার পরীক্ষা ডিরেক্টরিটির বিষয়বস্তু রয়েছে:
$ls -F test
Baltimore/ Cherry Hill/ Edison/ New York City/ Philadelphia/ cities.txt
এবং কোডগুলি যে ডিরেক্টরিগুলির মাধ্যমে লুপ করে:
for f in `find test/* -type d`; do
echo $f
done
এখানে ফলাফল:
পরীক্ষা / বাল্টিমোর পরীক্ষা / চেরি পাহাড় পরীক্ষা / এডিসনের পরীক্ষা / নিউ ইয়র্ক শহর পরীক্ষা / ফিলাডেলফিয়া
চেরি হিল এবং নিউ ইয়র্ক সিটি 2 বা 3 পৃথক এন্ট্রি হিসাবে বিবেচিত হয়।
আমি ফাইলের নামগুলি উদ্ধৃত করার চেষ্টা করেছি, এরকম:
for f in `find test/* -type d | sed -e 's/^/\"/' | sed -e 's/$/\"/'`; do
echo $f
done
কিন্তু কোন উপকার.
এটি করার একটি সহজ উপায় আছে।
নীচের উত্তরগুলি দুর্দান্ত। তবে এটিকে আরও জটিল করে তোলার জন্য - আমি সর্বদা আমার পরীক্ষার ডিরেক্টরিতে তালিকাবদ্ধ ডিরেক্টরিগুলি ব্যবহার করতে চাই না। কখনও কখনও আমি পরিবর্তে কমান্ড-লাইন প্যারামিটার হিসাবে ডিরেক্টরিতে পাস করতে চাই।
আমি চার্লসের আইএফএস স্থাপনের পরামর্শ নিয়েছি এবং নিম্নলিখিতগুলি নিয়ে এসেছি:
dirlist="${@}"
(
[[ -z "$dirlist" ]] && dirlist=`find test -mindepth 1 -type d` && IFS=$'\n'
for d in $dirlist; do
echo $d
done
)
কমান্ড লাইন আর্গুমেন্টে ফাঁকা স্থান না পাওয়া পর্যন্ত এটি ঠিক কাজ করে (এমনকি সেই সমস্ত যুক্তি উদ্ধৃত হয়)। উদাহরণস্বরূপ, স্ক্রিপ্টটিকে এভাবে কল করা: test.sh "Cherry Hill" "New York City"
নিম্নলিখিত আউটপুট উত্পাদন করে:
চেরি পাহাড় নতুন ইয়র্ক শহর
list="$@"
সম্পূর্ণ মানটির তালিকার নেসটি সম্পূর্ণরূপে বাদ দেয়, এটি একটি স্ট্রিংয়ে ধসে যায়। আমার উত্তরে অনুগ্রহ করে ঠিক যেমনটি দেওয়া হয়েছে ঠিক তেমন অনুসরণ করুন - এরকম কোনও নিয়োগের কোথাও কোথাও তাকে উত্সাহ দেওয়া হয় না; আপনি যদি কোনও প্রোগ্রামে কমান্ড-লাইন আর্গুমেন্টের একটি তালিকা পাস করতে চান তবে আপনার সেগুলি একটি অ্যারেতে সংগ্রহ করা উচিত এবং সেই অ্যারেটি সরাসরি প্রসারিত করা উচিত।