একটি লিনাক্স স্ক্রিপ্টে "পড়ার সময় ..." ব্যবহার করে


34

নিম্নলিখিত কোডটি কীভাবে কাজ করে কেউ দয়া করে ব্যাখ্যা করতে পারেন?

echo '1 2 3 4 5 6' | while read a b c
do
  echo $c $b $a
done

বিশেষত, আমি জানতে চাই কেন এই লুপটির আউটপুট 3 4 5 6 2 1, পরিবর্তে 3 2 1এবং 6 5 4দুটি পৃথক লাইনের? আমি মনে করি না যে এটি আমার চারপাশে জড়িয়ে আছে ...

উত্তর:


41

readস্ট্যান্ডার্ড ইনপুট থেকে একটি সম্পূর্ণ লাইন পড়ে, ক্ষেত্রগুলিতে লাইনটি বিভক্ত করে এবং প্রদত্ত ভেরিয়েবলগুলিতে এই ক্ষেত্রগুলি বরাদ্দ করে। যদি ভেরিয়েবলের চেয়ে বেশি টুকরো থাকে তবে অবশিষ্ট টুকরাগুলি শেষ ভেরিয়েবলের জন্য বরাদ্দ করা হয়।

আপনার ক্ষেত্রে $aবরাদ্দ করা হয়েছে 1, $bবরাদ্দ করা হয়েছে 2এবং $cবাকিটি 3 4 5 6


ধন্যবাদ ফ্লোরিয়ান! এখন এটি বোধগম্য হয় ... কিছু কারণে আমি ভেবেছিলাম যে স্পেসগুলি প্রতিটি পরিবর্তনশীল পাঠকে সীমিত করে দেবে, তবে দৃশ্যত তা নয়। আমি তোমার সাহায্য কে সাধুবাদ জানাই!!
লিনাক্সগ্রিংগো

24

এইভাবে লুপটি পুনরায় লেখালেখি ঘটে যা ঘটছে তা প্রকাশ করে:

echo '1 2 3 4 5 6' | while read a b c
  do
    echo '(iteration beginning)' a="$a" b="$b" c="$c" '(iteration ending)'
  done

এটি তার ফলাফল হিসাবে দেয়:

(iteration beginning) a=1 b=2 c=3 4 5 6 (iteration ending)

প্রথমে লক্ষ্য করুন যে কেবল একটি একক কমান্ড চালানো হয়েছে। যদি এটি একাধিকবার চালিত হয় তবে আপনি অন্যান্য বিষয়গুলির মধ্যেও একবার (iteration beginning)এবং (iteration ending)একাধিকবার মুদ্রিত সাবস্ট্রিংগুলি দেখতে পাবেন ।

এটি whileএখানে লুপ থাকা সত্যই কোনও কাজ সম্পাদন করে না বলে lish readBuiltin হোয়াইটস্পেস বিভাজিত পাঠ্য সার্চ 1 প্রতিটি নির্দিষ্ট পরিবর্তনশীল মধ্যে। অতিরিক্ত ইনপুট নির্দিষ্ট করা শেষ ভেরিয়েবলের শেষে যুক্ত হয়। 2 সুতরাং ভেরিয়েবলগুলি aএবং bমানগুলি গ্রহণ করে 1এবং 2যথাক্রমে মানগুলি cগ্রহণ করে 3 4 5 6

যখন লুপ শর্তটি ( while read a b c) দ্বিতীয়বার মূল্যায়ন করা হয়, পাইপ থেকে আর কোনও ইনপুট পাওয়া যায় না (আমরা কেবল এটি পাঠ্যর একক লাইন পাইপ করেছি), সুতরাং readকমান্ডটি সত্যের পরিবর্তে মিথ্যাতে মূল্যায়ন করে এবং লুপটি বন্ধ হয়ে যায় (কখনও কখনও কার্যকর করার আগে) শরীর দ্বিতীয়বার)।

1 : কারিগরী এবং নির্দিষ্ট হবে, builtin যখন আর্গুমেন্ট হিসাবে পরিবর্তনশীল নামের পাস, ইনপুট, সার্চ পৃথক "শব্দ" সেটিকে বিভাজন যখন এটি সম্মুখ IFS হোয়াইটস্পেস (এছাড়াও দেখুন এই প্রশ্নের এবং এই নিবন্ধটি )।read

2 : readনির্দিষ্ট করা শেষ ভেরিয়েবলের ইনপুটগুলির কোনও অতিরিক্ত ক্ষেত্র জ্যাম করার আচরণ প্রথমে অনেকগুলি স্ক্রিপ্টারের কাছে অপ্রয়োজনীয়। এটি বোঝা সহজ হয়ে যখন আপনি যে বিবেচনা, যেমন ফ্লোরিয়ান Diesch এর উত্তর বলে , readসবসময় হবে একটি সম্পূর্ণ লাইন পড়ুন (চেষ্টা) - এবং যে readউভয় সঙ্গে এবং একটি লুপ ছাড়া ব্যবহারযোগ্য হতে উদ্দেশ্যে করা হয়।


এলিয়, সমস্ত বিবরণ ব্যাখ্যা করার জন্য সময় দেওয়ার জন্য ধন্যবাদ। আমি সন্দেহ করি যে whileএই উদাহরণে এটির সাধারণ উদ্দেশ্যটি কার্যকর হয় নি, তবে তারপরে readকমান্ডটি আমাকে ফেলে দেয় ... কোনওভাবে, আমি এটিকে " read a b cমিথ্যা নয়, করি echo ..." হিসাবে ব্যাখ্যা করেছি । এটি কীভাবে কাজ করেছে তা ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ। আমি গতকাল এই কোডটি পেরিয়ে এসেছি এবং আমি জানতাম যতক্ষণ না আমি এটি বের করে ফেলব ... লোল
লিনাক্সগ্রিংগো

@linuxgringo বাস্তবিক, লুপ শরীর হয় প্রতিটি সময় মৃত্যুদন্ড কার্যকর read a b cসত্য মূল্যায়ণ এবং লুপ শর্ত ( read a b c) একাধিকবার চালানো নেই। বিট এটি শুধুমাত্র মূল্যায়ণ সত্য 1st সময়। ২ য় বার, পাইপ থেকে আর পড়ার মতো কোনও ইনপুট নেই, সুতরাং ফাইলটির শেষের মুখোমুখি হয়, যার ফলে মিথ্যাread প্রত্যাবর্তন ঘটে । ( বিশদগুলির জন্য "প্রস্থান স্থিতি" -এ আউটপুটটির শেষ অংশটি দেখুন , উল্লেখ করে শেল স্ক্রিপ্টিংয়ে শূন্যের অর্থ সত্য এবং ননজারো মানে মিথ্যা।) আপনি যদি ইনপুটটির একাধিক লাইন পাইপ করেন তবে লুপ বডিটি একাধিকবার মৃত্যুদন্ড কার্যকর করা। help readwhile read ...
এলিয়াহ কাগান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.