ভেরিয়েবলে সঞ্চিত একাধিক-লাইনের স্ট্রিংয়ের উপরে আইট্রেটিং


17

আমি পড়েছি যে ভালো জিনিস লিখতে খারাপ for line in $(command), এর পরিবর্তে সঠিক উপায় বলে মনে হচ্ছে:

command | while IFS= read -r line; do echo $line; done

এটি দুর্দান্ত কাজ করে। তবে আমি যদি পুনরুক্তি করতে চাই তবে কোনও ভেরিয়েবলের বিষয়বস্তু , কোনও কমান্ডের প্রত্যক্ষ ফলাফল নয়?

উদাহরণস্বরূপ, কল্পনা করুন যে আপনি নিম্নলিখিত ফাইলটি তৈরি করেছেন quickfox:

The quick brown
foxjumps\ over -
the
lazy ,
dog.

আমি এই জাতীয় কিছু করতে সক্ষম হতে চাই:

# This is just for the example,
# I could of course stream the contents to `read`
variable=$(cat quickfox);
while IFS= read -r line < $variable; do echo $line; done; # this is incorrect

উত্তর:


19

বাশ এবং জেডএস এর মতো আধুনিক শেলগুলিতে আপনার কাছে খুব দরকারী `<<< 'রিডাইরেক্টর রয়েছে যা স্ট্রিংটিকে ইনপুট হিসাবে গ্রহণ করে। সুতরাং আপনি করতে হবে

while IFS= read -r line ; do echo $line; done <<< "$variable"

অন্যথায়, আপনি সবসময় করতে পারেন

echo "$variable" | while IFS= read -r line ; do echo $line; done

দুঃখিত, আমি অবশ্যই বিষয়বস্তু প্রতিধ্বনি সম্পর্কে চিন্তা করা উচিত ছিল। তবে যাইহোক দ্রুত উত্তর দেওয়ার জন্য ধন্যবাদ!
শেলজহান

1
আপনি $variableএটি ব্যবহার করার সময় আপনার ডাবল-উদ্ধৃতি প্রয়োজন , অন্যথায় whileলুপটি কেবলমাত্র একটি লাইন ইনপুট পাবে। উদাহরণস্বরূপ, echo $variableবনাম echo "$variable"বা cat <<< $variableবনাম মধ্যে আউটপুট মধ্যে পার্থক্য দেখুন cat <<< "$variable"
ক্যাস

@ ক্যাস আসলে এটি inside ভেরিয়েবলের ভিতরে কী রয়েছে তার উপর নির্ভর করে। ওপি ("ভেরিয়েবল = $ (বিড়াল কুইকফক্স)") উপস্থাপিত ক্ষেত্রে এটি অতিরিক্ত উদ্ধৃতি ব্যতীত কাজ করে। তবে সাধারণ ক্ষেত্রে, আপনি ঠিক বলেছেন। আমি আমার উত্তর সম্পাদনা করি। ধন্যবাদ।
দীর্ঘ

variable=$(cat quickfox)ওপি প্রশ্ন নিজেই আমি কি সম্পর্কে কথা ছিল একটি উদাহরণ প্রদান করে। ব্যবহার করে $variableডাবল কোট ভিতরে নতুন লাইন অন্তর্ভুক্ত, ছাড়া নতুন লাইন শেল দ্বারা স্থানগুলি যাদের কাছে অনুবাদ করেছে এটি ব্যবহার। আপনি যদি লাইন বাই লাইন পড়েন এবং প্রক্রিয়াজাত করেন, তবে এটির সাথে একটি বিশাল পার্থক্য আসে - প্রাক্তনটির সাথে আপনার একাধিক ইনপুট লাইন থাকে, পরবর্তীগুলির সাথে আপনার কেবল একটি ইনপুট লাইন থাকে। ইনপুট ডেটা অতিমাত্রায় অনুরূপ তবে বাস্তবে, এই দুটি ক্ষেত্রে সম্পূর্ণ আলাদা।
ক্যাস

উদাহরণস্বরূপ: সেই ইনপুট ডেটার সাথে, cat <<< "$variable" | wc -lপ্রত্যাবর্তন করে returns. cat <<< $variable | wc -lপ্রত্যাবর্তন ১. যদি আপনি / ভেরিয়েবলের (নিউলাইনস, ট্যাবগুলি, একক বা একাধিক স্পেস সহ) হোয়াইটস্পেস সংরক্ষণ করতে চান / আপনি ভেরিয়েবলটি ব্যবহার করার সময় ডাবল-উদ্ধৃতি আবশ্যক, অন্যথায় সেগুলি প্রতিটি "শব্দের" মধ্যে একটি একক জায়গায় পরিবর্তিত হবে।
ক্যাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.