কোন ম্যাচ নেই যখন ম্যাচ * ম্যাচিং কিভাবে হ্যান্ডেল?


6

আসলে আছে যখন নীচের bash স্নিপেট মহান কাজ করে *.txt ডিরেক্টরির মধ্যে ফাইল।

for txt in *.txt
do                                               
  echo "loading data from $txt"
done   

যখন না হয়, আক্ষরিক *.txt $ txt (ভাল না) হিসাবে লুপ মধ্যে পড়ে।

আমি কিভাবে এই কোড পরিবর্তন যাতে যখন কোন আছে *.txt ফাইল, দী do ... done ব্লক বাদ দেওয়া হয়?


1
if [ "*.txt" != '*.txt' ] ; then do loop here ; fi
ott--

@ ott-- +1 বিকল্প সমাধান দেওয়ার জন্য
kfmfe04

1
@ott: [ "*.txt" != '*.txt' ] সবসময় মিথ্যা - উভয় স্ট্রিং কোট হয়, তাই না মিল জন্য চেক পায়। আপনি যদি এক থেকে উদ্ধৃতি মুছে ফেলেন ... অন্য সমস্যা আছে।
Gordon Davisson

@ গর্ডন ডেভিসন +1 এটিকে ইঙ্গিত দেওয়ার জন্য: শেল স্ক্রিপ্টিং চমকপ্রদ বলে মনে হচ্ছে ...
kfmfe04

1
@ গর্ডন ডেভিসন প্রকৃতপক্ষে, এটি কাজ করার জন্য 2 টি পদক্ষেপে করা উচিত: files=$(echo *.txt) এবং তারপর: if [ "${files}" != '*.txt' ] ; then
ott--

উত্তর:


9

দেখে মনে হচ্ছে গুগল এটার উত্তর দিয়েছে।

আগে এই জাদু incantation রাখুন for বিবৃতি:

shopt -s nullglob

সচেতন থাকুন যে এটি "ls * .txt" মত কমান্ডগুলিতে আশ্চর্যজনক পার্শ্ব প্রতিক্রিয়া সৃষ্টি করতে পারে।
noonex

4

Nullglob বিকল্পটি (@ kfmfe04 এর উত্তর) যদি আপনি ব্যাশ (কোনও ব্র্যান্ড-এক্স শেল না) ব্যবহার করেন, এবং nullglob পরিবর্তন / অন্য কিছু ভাঙ্গার বিষয়ে চিন্তা করতে হবে না। অন্যথায়, আপনি এই (সামান্য messier) বিকল্প ব্যবহার করতে পারেন:

for txt in *.txt
do
  [ -e "$txt" ] || continue
  echo "loading data from $txt"
done

এটি নীরবভাবে এমন ফাইলগুলিকে এড়িয়ে যায় যা বিদ্যমান নেই (প্রধানত "* .txt" যদি কোন মিল না থাকে তবে সম্ভবত ফাইলগুলি যেগুলির মধ্যে মুছে ফেলা হয়েছিল for তালিকা তৈরি এবং যখন লুপ তাদের পেয়েছিলাম ...)


একটি ফাইল মধ্যে মুছে ফেলা হতে পারে -e আমন্ত্রণ এবং পরে প্রক্রিয়াকরণ এখনও ...
Koterpillar

@ কোটারপিলার সত্য, কিন্তু পরীক্ষার -e বিলোপ একটি সমস্যা যেখানে সময় উইন্ডো হ্রাস।
Gordon Davisson
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.