আমি কীভাবে টেস্ট প্রোগ্রামের পাইপ থেকে মানটি ব্যবহার করতে পারি?


10
wc -l | test -eq 1

এটি কাজ করে না। আমি ডাব্লুসি ফলাফলের ফলাফলের সাথে 1 এর মানটির তুলনা করতে চাই I আমি কীভাবে এটি করতে পারি?

উত্তর:


9

এটি পাইপ সম্পর্কে আপনার প্রশ্নের উত্তর দেয় না, তবে আপনি পুনরায় সাজিয়ে নিতে পারেন:

test $(ls -l | wc -l) -eq 1 && echo "worked"

এবং এসও এর কয়েকটি সমাধান রয়েছে , এটি সর্বোত্তম:

ls -l | wc -l | { read wc; test $wc -eq 7 && echo "woohoo"; }

4

আপনি যদি ব্যাশ ব্যবহার করছেন তবে আপনি সম্ভবত পাইপস্ট্যাটাস ভেরিয়েবলটি গবেষণা করতে চান। বাশ রেফারেন্স গাইডে উল্লিখিত হিসাবে , পিপেসেস্ট্যাটাস

একটি অ্যারে ভেরিয়েবল (অ্যারে দেখুন) সর্বাধিক সর্বাধিক-এক্সিকিউটেড ফোরগ্রাউন্ড পাইপলাইনে (যাতে কেবলমাত্র একটি একক কমান্ড থাকতে পারে) প্রক্রিয়াগুলি থেকে প্রস্থান স্থিতির মানগুলির একটি তালিকা রয়েছে।

পাইপস্ট্যাটাস সহ এই পাইপলাইনের জন্য প্রস্থান কোডগুলি কী ছিল তা আমরা খুঁজে পেতে পারি:

dmesg | grep -iw 'nnse' | wc -l

আপনি যদি এখন অ্যারে ভেরিয়েবলটি জিজ্ঞাসা করেন তবে আপনি পাইপলাইনে ব্যবহৃত আদেশগুলি উল্লেখ করে প্রস্থান স্থিতিগুলি পাবেন:

echo ${PIPESTATUS[@]}
0 1 0

(একটি ইনডেক্সড অ্যারেতে, উপরের এই প্রস্থানকারী কোডগুলি অ্যারেতে 0 1 এবং 2 দ্বারা প্রতিনিধিত্ব করা হয় কারণ অ্যারেগুলি সর্বদা বাশে 0 এ শুরু হয়))

এখানে আমরা দ্বিতীয় কমান্ডটি 1 এবং বাকি 0 টি ফিরে এসে দেখি; তবে wc -lশূন্য ম্যাচ থাকলে 0 প্রদান করে যা কোনও ত্রুটি নয়। ব্যর্থতা একটি শূন্য-মান সহ উপস্থাপন করা হয়, এবং অন্যান্য ত্রুটি মান যেমন 127 যা কমান্ড পাওয়া যায় নি, এবং আরও প্রোগ্রাম যা সম্পর্কিত প্রোগ্রামের সাথে নির্দিষ্ট হতে পারে।

আপনি যদি পাইপলাইনে কোনও নির্দিষ্ট কমান্ডের প্রস্থান কোডটি দেখতে চান তবে আপনি কেবল সেই মানটি অ্যাক্সেস করতে পারবেন। উপরের পাইপলাইনে গ্রেপ কমান্ডটি ছিল দ্বিতীয় কমান্ড, তবে অ্যারে 0 থেকে শুরু হওয়ার সাথে সাথে আমাদের প্রবেশের প্রয়োজন।

সুতরাং গ্রেপ কমান্ডের প্রস্থান কোডটি সন্ধান করার জন্য, উপরের পাইপলাইনটি আবার চালান (পিপিসটাসাসের সামগ্রীটি আপনি চালিত হলে নিঃশেষ হয়ে যাবে echo ${PIPESTATUS[@]}) এবং তারপরে নীচের কমান্ডটি কার্যকর করুন যা 1 (প্রস্থান কোড) ফিরে আসবে:

echo ${PIPESTATUS[1]}
1

একটি স্ক্রিপ্টে, নিশ্চিত করুন যে পাইপলাইনের কাজ শেষ হওয়ার আগেই আপনি পিআইপিএসটিটাস অ্যারে ভেরিয়েবলের বিষয়বস্তু সন্ধান করবেন।

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

dmesg | grep -iw 'nnse' | wc -l
[ ${PIPESTATUS[1]} -eq 1 ] && do_something_here

এটি কেবলমাত্র একটি খণ্ড, কারণ আপনি কী ধরণের স্ক্রিপ্টের উদ্দেশ্যে যাচ্ছেন তা আমি জানি না তবে আমি আশা করি পাইপেসটাস সম্পর্কে জানার জন্য আপনার কিছুটা কার্যকর হতে পারে। PIPESTATUS এর মতো অনেকগুলি ব্যাশ অ্যারে ভেরিয়েবল রয়েছে যা অত্যন্ত কার্যকর হতে পারে; দেখতে ব্যাশ রেফারেন্স গাইড পুরো তালিকার জন্য, এবং তাদের ব্যবহারের উদাহরণের জন্য অন্যান্য Stackexchange সাইট।



1

এটি প্রতিটি testক্ষেত্রে আচ্ছাদন করে না, তবে আপনি যদি নিয়মিত এক্সপ্রেশন এবং grepপাইপযুক্ত স্ট্রিং ব্যবহার করতে পারেন তবে এটি বেশ সোজা এগিয়ে রয়েছে কারণ এর grepসাথে testমিল নেই যখন কোনও মিল পাওয়া যায় না it

cat file | wc -l | grep -qE '^\s*1\s*$'

বর্ধিত নিয়মিত এক্সপ্রেশন আপনাকে এই কৌশলটি দিয়ে অনেকগুলি ক্ষেত্রে কভার করতে দেয়। জিগলসের জন্য, একটি পরীক্ষার কেস:

for i in 1 11 '' foo; do 
  if echo $i | grep -qE '^\s*1\s*$'; then 
    echo "'$i' matched"
  else
    echo "'$i' didn't match."
  fi
done

আউটপুট:

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