আমি যতদূর দেখতে পাচ্ছি, আপনার কোডে আপনার কোনও অ্যারে নেই। ভেরিয়েবল 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
অনুরূপ শেলের মধ্যে চলবে )।
কেবলমাত্র নিশ্চিত হয়ে নিন যে স্ক্রিপ্টটি কার্যকর হয় এবং আপনি কোনও স্পষ্টত দোভাষীকে নির্দিষ্ট না করেই এটিকে চালিত করেন।