ইওএফ ব্যবহার না করে ব্যাশ স্ক্রিপ্ট থেকে পাঠ্য ইনপুট স্বয়ংক্রিয় করা


10

আমি উবুন্টু লিনাক্স চালাচ্ছি। ধরুন এখানে একটি প্রোগ্রাম বলা হয়েছে myprogram। এই প্রোগ্রামটি ব্যবহারকারীকে ইনপুট দেওয়ার জন্য অনুরোধ করে; বিশেষত, যখন জিজ্ঞাসা করা হয় এবং টিপবে তখন ব্যবহারকারীকে অবশ্যই পূর্ণসংখ্যা টাইপ করতে হবে Enter। আমি ব্যাশ স্ক্রিপ্ট ব্যবহার করে এই প্রক্রিয়াটি স্বয়ংক্রিয় করতে চাই। বিশেষত, আমি নির্বাহ করতে চাই myprogram, বলতে চাই, 100 বার ( iযে কাউন্টারটি ব্যবহার 1করে 100)। প্রতিটি কার্যকর করার সময় myprogram, আমি iযখন জিজ্ঞাসা করা হয় তার বর্তমান মানটি লিখতে চাই ।

(যাইহোক, myprogramবিকল্পগুলি / স্যুইচগুলি নেয় -options, এর সবগুলি ধ্রুব হবে এবং এইভাবে বাশ স্ক্রিপ্টের মধ্যে নির্দিষ্ট করা হবে)

এই ব্যাশ স্ক্রিপ্টের একটি অসম্পূর্ণ কঙ্কাল হতে পারে:

#!/bin/bash
for i in {1..100}
do
   myprogram -options
done

এখন আমি উপরের কোডটি সংশোধন করতে চাই যাতে iপ্রোগ্রামটির মাধ্যমে অনুরোধ জানানো হলে এর বর্তমান মান প্রবেশ করা হয়। এই কাজ করতে সবচেয়ে ভালো উপায় কি?

আমি যে সফ্টওয়্যারটি ব্যবহার করছি তার ওয়েবসাইটটি লাইনের <<EOFশেষে ব্যবহার করার পরামর্শ দেয়myprogram -options । আমি মনে করি যে এটি ইনপুটটি ব্যবহারের জন্য "ফাইলের শেষ" দিকে তাকানোর জন্য বাশকে বলে। তবে আমি যদি ফাইলটির শেষে ইনপুট রাখতে না চাই ? আমি যদি তা পরে <<বা এটির পরে রাখতে চাই <?

কারণ হ'ল বিষয়গুলি আরও জটিল হবে। উদাহরণস্বরূপ, আমি একটি পূর্ণসংখ্যার কাউন্টার উপস্থাপন করতে পারি jযা কিছু অ-রৈখিক, অ-অনুক্রমিক উপায়ে পরিবর্তিত হয়। আমি তখন বর্তমান মূল্য ভোজন চাইবেন jকরার myprogramপ্রতিটি পুনরাবৃত্তির উপর, কিন্তু এর মান jথেকে কল মধ্যে পরিবর্তন হতে পারে myprogram -optionsএবং ফাইল শেষে EOF

তোমার কি কোন মতামত আছে?


উত্তর:


14

স্ট্যান্ডার্ড ইনপুটটির মাধ্যমে প্রোগ্রামটি খাওয়ানোর মাধ্যমে প্রায় সমস্ত প্রোগ্রামের জন্য echo $i | myprogram -optionsএবং উভয়ই myprogram -options <<<$iকাজ করা উচিত $i

<foofooস্টিডিন নামে ফাইলটির বিষয়বস্তু ব্যবহার করবে ।

<<fooএতে এবং একটি লাইনের মধ্যে থাকা পাঠ্যটি সম্পূর্ণভাবে fooস্ট্যান্ডার্ড ইনপুট হিসাবে ব্যবহার করবে । গিলস যেমন বলেছিলেন, এটি এখানে একটি দলিল (হেরডোক); EOFআসলে ফাইলটির সমাপ্তি বলতে বোঝায় না, এটি কেবলমাত্র একটি সাধারণ বংশগত ডিলিনেটর (আমরা এই উদাহরণের পরিবর্তে "ফু" ব্যবহার করি)।

<<<fooস্ট্রিং "ফু" স্ট্যান্ডার্ড ইনপুট হিসাবে ব্যবহার করবে। আপনি একটি পরিবর্তনশীলও নির্দিষ্ট করতে পারেন $foo, এবং শেলটি এর সামগ্রীগুলি স্টিডিন হিসাবে ব্যবহার করবে, যেমন আমি উপরে দেখিয়েছি। একে হেরস্ট্রিং বলা হয় , কারণ এটি একটি হেরডোকের মতো পুরো ব্লকের বিপরীতে একটি সংক্ষিপ্ত স্ট্রিং ব্যবহার করে। হেরেস্ট্রিংস ব্যাশে কাজ করে তবে তা তেমন হয় না /bin/sh


9

এই ওয়েবসাইট দ্বারা প্রস্তাবিত সিনট্যাক্সকে এখানে ডকুমেন্ট বলা হয় । ফাইল প্রোগ্রামের ইনপুটটি ধারণ করে রেখার সাথে সাথেই শুরু হয়ে যায় <<EOFএবং এটি স্ক্রিপ্টের শেষে শেষ হয় না, তবে ঠিক এমন পাঠ্যযুক্ত একটি লাইন দ্বারা EOF(অতিরিক্ত শ্বেতস্থান না রাখার যত্ন নিন)। যাইহোক, আপনি কোনও শেল বিশেষ অক্ষর ধারণ করে না এমন কোনও শেষ চিহ্ন ব্যবহার করতে পারেন: কোনও EOFকীওয়ার্ড নয়, এটি নিছক traditionalতিহ্যগত।

#!/bin/bash
for i in {1..100}
do
   myprogram -options <<EOF
$i
EOF
   for j in {1..42}; do
     myprogram2 <<EOF
$i
$j
EOF
   done
done

অন্য কথায়, এই প্রসঙ্গে ইওফের অর্থ ফাইলের শেষের একটি চিহ্ন , স্ক্রিপ্ট ফাইলটির প্রকৃত শেষ নয়। "EOF" পাঠ্যটি যেকোন স্বেচ্ছাসেবী পাঠ্য - আপনি << অক্ষরের সাথে সাথেই যা কিছু ব্যবহার করুন তা এখানে-এখন নথির শেষ নির্দেশ করবে। আমি সাধারণত ব্যবহার ফাইলের শেষে কারণ এটি দাঁড়িয়েছে আউট ও খুব herenow ডকুমেন্ট যদি, যেমন, আমি programatically-উৎপাদিত করছি শেল স্ক্রিপ্ট (যা আমি বেশ ঘন ঘন) ভিতরে হতে করার সম্ভাবনা কম।
কাস

বোল্ড ফাইলের শেষে থাকা উচিত যে <আন্ডারস্কোর> <আন্ডারস্কোর> ফাইলের শেষে <আন্ডারস্কোর> <আন্ডারস্কোর>
CA গুলির

এখানে এই জাতীয় নথি ব্যবহার করে, আমি প্রায়শই শেষের চিহ্নিতকারীটিকে অনেক বেশি অর্থবহ (এবং "এলোমেলোভাবে" মিলিত হওয়ার সম্ভাবনা কম) যেমন পছন্দ করি তেমন পরিবর্তন করে ফেলেছি END_OF_WHATEVER_FUNCTION। কখনও কখনও, স্থান / আকার "সংরক্ষণ" করার চেষ্টা করা আসলে ব্যর্থতার কারণ এটি প্রকৃতপক্ষে কী ঘটছে তা নিয়ে অস্পষ্টতা সৃষ্টি করে।
হত্যাকারী

sleepস্ক্রিপ্ট থেকে পড়া কমান্ডগুলির মধ্যে আপনি কীভাবে থাকতে পারেন ?
বল্টআপ_আইম_কোডিং

@ অপ্রত্যাশিত 62 আপনি কি জিজ্ঞাসা করছেন তা আমি বুঝতে পারি না। আপনার সম্ভবত এই সাইটে একটি নতুন প্রশ্ন জিজ্ঞাসা করা উচিত। যথেষ্ট প্রসঙ্গে অবশ্যই নিশ্চিত হন।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

3

এখানে উপরের কেভিন এবং গিলস উভয়ই উল্লিখিত নথি বা সাধারণ পাইপিং অনেক ক্ষেত্রে কাজ করবে।

আরও জটিল পরিস্থিতির জন্য আপনি প্রত্যাশা বা অনুরূপ সন্ধান করতে চাইতে পারেন (যেমন: প্রত্যাশা :: সরল সিপিএন মডিউল পার্ল বাস্তবায়ন ব্যবহার করা খুব সহজ)। ব্যক্তিগতভাবে, আমি পার্ল মডিউলটি পছন্দ করি (নিজেকে প্রত্যাশা করুন টিসিএল) তবে অনেকগুলি সাধারণ স্ক্রিপ্টিং ভাষার জন্য বাস্তবায়ন রয়েছে। এমনকি শিখতে বা পড়তে এবং পড়ার সময় ধারণাটির খুব আদিম বাস্তবায়ন লেখা সম্ভব possible

প্রত্যাশা এবং অনুরূপ সরঞ্জামগুলির সাধারণ ধারণাটি হ'ল কোনও প্রোগ্রামের আউটপুটে একটি নির্দিষ্ট স্ট্রিং বা প্যাটার্নের জন্য অপেক্ষা করা এবং তারপরে আপনি যা চান ইনপুটটি এটি খাওয়ান।

একটি সাধারণ উদাহরণ ব্যবহার হ'ল লগইন স্বয়ংক্রিয়ভাবে, "প্রত্যাশা" (অর্থাত্ অপেক্ষা করা) স্ট্রিং "ওগিন:" দ্বারা, লগইন-নামটি প্রেরণ করুন, তারপরে স্ট্রিংটি "শব্দ:" প্রত্যাশা করুন এবং পাসওয়ার্ডটি প্রেরণ করুন।

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

... এবং আপনার প্যাচটি মাইক্রোগ্রামে ফিরে প্রবাহে জমা দিতে ভুলবেন না :) এমনকি আপনি এটি কোড করে দেওয়ার পদ্ধতিটি তারা পছন্দ না করলেও তারা নিজেরাই বৈশিষ্ট্যটি যুক্ত করার মত ধারণাটি পছন্দ করতে পারে। প্রবাহের ডেভসগুলি এমন লোকদের প্রশংসা করে যা তাদের বাটগুলি বন্ধ করে দেয় এবং চাহিদা বা অভিযোগের চেয়ে অবদান রাখে।

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