শেল স্ক্রিপ্টে সংখ্যার অ্যারে দিয়ে পুনরাবৃত্তি কীভাবে করবেন?


1

আমি কিছু কমান্ড কার্যকর করার পরে তৈরি একটি অ্যারের মাধ্যমে পুনরাবৃত্তি করার চেষ্টা করছি। ব্যবহৃত কোডটি হ'ল:

#!/bin/bash
mailx -H|grep '^ [UN]'>ListOfMessages.txt
msgNumbers=`cut -c 4-5 ListOfMessages.txt`
echo $msgNumbers
for msg in "${msgNumbers[@]}";
do
echo $msg;
echo $msg|mailx;
done

ListOfMessages.txt দেখতে দেখতে:

 U  5 Sender1    Thu Aug 23 14:28  179/10454 Incident
 U  7 Sender2    Thu Aug 23 15:20  179/10456 Incident
 U  8 Sender3    Thu Aug 23 15:41  192/10801 Incident
 N  9 Sender4    Thu Aug 23 15:45  197/11011 Incident

অ্যারে প্রয়োজনীয় হিসাবে 5 7 8 9 নম্বরগুলি সহ আপডেট হচ্ছে। আমি "খারাপ সাবস্টিটিউশন" ত্রুটি পেতে থাকি (লুপের জন্য যেখানে শুরু হয় সেই লাইনে)।

দয়া করে শি-ব্যাং ব্যবহার করার জন্য আমাকে পরামর্শ দিন।


উত্তর:


2

আমি যতদূর দেখতে পাচ্ছি, আপনার কোডে আপনার কোনও অ্যারে নেই। ভেরিয়েবল msgNumbersএমন একটি স্ট্রিং যা আপনার cutকমান্ডের আউটপুট ধারণ করে ।

এর আউটপুট উপর পুনরাবৃত্তি করতে cut, ব্যবহার করুন

#!/bin/bash

mailx -H | grep '^ [UN]' | cut -c 4-5 |
while read msg; do
    print 'msg = %s\s' "$msg"
done

এটি পাইপ ( ) এর মাধ্যমে তাৎক্ষণিকভাবে অনুসরণ cutকরে whileলুপের আউটপুট প্রেরণ করে |whileলুপ সঙ্গে পুনরুক্তি হবে msgথেকে আউটপুট প্রতিটি লাইন সেট cut

cutথেকে সরাসরি তার ডেটা পায় grepকমান্ড, যা একটি অন্তর্বর্তী ফাইল বা পরিবর্তনশীল মধ্যে ডেটা সঞ্চয় করার জন্য প্রয়োজন সরিয়ে ফেলা হয়।

আমি echo $msg|mailx;কমান্ডটি অপসারণ করেছি কারণ এটি আমার কাছে খুব বেশি বোঝায় না ( mailxডেটাতে প্রেরণের জন্য ইউটিলিটির একটি ঠিকানা প্রয়োজন)।

grep+ + cutএছাড়াও একটি একক কল দ্বারা প্রতিস্থাপিত হতে পারে awkযেখানে আমরা দিন awkযখন রেগুলার এক্সপ্রেশনের সাথে মেলে উভয় টুলস এবং আউটপুট কাজ দ্বিতীয় হোয়াইটস্পেস-সীমা নির্দেশ করা কলাম করুন:

#!/bin/bash

mailx -H | awk '/^ [UN]/ { print $2 }' |
while read msg; do
    print 'msg = %s\s' "$msg"
done

আমি এর ব্যবহারের বিষয়ে আরও মন্তব্য করছি না mailxকারণ এটি একটি মানহীন ইউটিলিটি যা ইউনিক্স সিস্টেমগুলিতে কিছুটা ভিন্নভাবে প্রয়োগ করা হয়েছে ( -Hউদাহরণ হিসাবে, আমার সংস্করণটির কোনও বিকল্প নেই) have


#!লাইন আমার কাছে ঠিক আছে দেখে মনে হচ্ছে আপনি চাইলে স্ক্রিপ্ট দ্বারা নিষ্পন্ন করা হবে bashএবং যদি bashএক্সিকিউটেবল সেই পথ এ অবস্থিত (যা এটা সাধারণত উদাহরণস্বরূপ, লিনাক্স সিস্টেমে, কিন্তু সঙ্গে চেক command -v bashনিশ্চিত হতে আপনার সিস্টেমে)। আমি উপরে পোস্ট করা কোডটির সাথে সামঞ্জস্যপূর্ণ /bin/sh, তাই bashএটি চালানোর জন্য আসলেই এটির প্রয়োজন হয় না (এটি কোনও shঅনুরূপ শেলের মধ্যে চলবে )।

কেবলমাত্র নিশ্চিত হয়ে নিন যে স্ক্রিপ্টটি কার্যকর হয় এবং আপনি কোনও স্পষ্টত দোভাষীকে নির্দিষ্ট না করেই এটিকে চালিত করেন।


বোর্ন শেল ত্রুটির বার্তা পেয়ে তারা সম্ভবত সোলারিসে (10 বা তার বেশি) on
স্টাফেন চেজেলাস

0

দ্বিগুণ উল্লেখ করুন না _ সংখ্যার রেফারেন্স, এবং, নাম্বার একটি অ্যারে নয়, তাই সূচীকরণ অর্থহীন।


ঠিক আছে ... তাহলে আপনি কীভাবে কমান্ডের ফলাফল সংরক্ষণ করবেন তা আমাকে পরামর্শ দিতে পারেন: কাট-সি 4-5 তালিকা -ফর্মেসেস.টেক্সট যাতে আমি লুপগুলিতে একের পর এক মানগুলি ব্যবহার করতে পারি?
দেবজিথ

প্রথমার্ধটি কীভাবে লুপ কাজের জন্য তৈরি করবেন এবং দ্বিতীয়ার্ধে উন্নতির দিকে ইঙ্গিত দেয়। যদি অনুরোধকারী শুরু থেকে ইনপুট নমুনা দিতেন তবে আরও বিশদ উত্তর (বা এমনকি সম্পূর্ণ বিকাশযুক্ত সমাধান) সরবরাহ করা যেতে পারে।
RudC

0

()অ্যারে হিসাবে মান সংরক্ষণ করতে ব্যবহার করুন ।

msgNumbers=(`cut -c 4-5 ListOfMessages.txt`)
echo "${msgNumbers[@]}"
for msg in "${msgNumbers[@]}";
do
echo $msg;
done

আপনার জবাব দিয়ে চেষ্টা করা হয়েছে .... তবে একটি ত্রুটি পেয়েছে: শেল_সক্রিপ.শ: লাইন ৪ এ বাক্য গঠন: `# নাম্বার = 'অপ্রত্যাশিত
দেবজিথ

@ দেজিজিথ, আবারও আপনি স্ক্রিপ্টটি ব্যাখ্যা করার চেষ্টা করেছেন sh, না bash। স্ক্রিপ্টটি চালাবেন না sh the-scriptchmod a+x the-scriptতারপরে একটি করুন./the-script
স্টাফেন চেজেলাস

0

বিষয়টি সমাধান হয়ে গেছে। সমস্যাটি হ'ল _ সংখ্যাগুলি কোনও সূচকযুক্ত অ্যারে ছিল না। তাই আমি পরিবর্তিত for msg in "${msgNumbers[@]}";করতে for msg in ${msgNumbers};তার কাজ .Now। কোডের বাকী অংশটি আমার প্রশ্নের মতো।


এটি এখনও কোনও অ্যারে নয় এবং এখন আপনি নিজের পরিবর্তনশীলটিতে স্ট্রিংয়ের শব্দের বিভক্তকরণ এবং শব্দের বিভাজন দ্বারা উত্পন্ন শব্দগুলির উপর ফাইলের নাম জেনারেশন ("গ্লোব্বিং") নির্ভর করে on IFSভেরিয়েবলটি এক বা একাধিক ডিজিটে সেট করা থাকলে আপনার কোডটি এখন ভেঙে যাবে ।
Kusalananda
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.