কমান্ডের আউটপুট শেল স্ক্রিপ্টে একটি নির্দিষ্ট স্ট্রিং রয়েছে কিনা তা পরীক্ষা করা হচ্ছে


116

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


আপনি যে আউটপুটটির সন্ধান করছেন সেগুলি তৈরি করার পরে কি কমান্ডটি চালিয়ে যাওয়া দরকার, বা তত্ক্ষণাত বন্ধ করা যেতে পারে? (আপনার দুটি উত্তর এই ক্ষেত্রে তাদের শব্দার্থবিজ্ঞানের দিক থেকে পৃথক)
চার্লস ডাফি

উত্তর:


97

গ্রেপের রিটার্ন মান পরীক্ষা করুন:

./somecommand | grep 'string' &> /dev/null
if [ $? == 0 ]; then
   echo "matched"
fi

যা মূর্খভাবে যেমন করা হয়:

if ./somecommand | grep -q 'string'; then
   echo "matched"
fi

এবং যদিও:

./somecommand | grep -q 'string' && echo 'matched'

2
এই কোডটি সমস্ত পসিক্স শেলগুলির সাথে কাজ করে না: পসিক্স স্ট্যান্ডার্ডটিতে কেবল =তুলনামূলক অপারেটর হওয়া দরকার , নয় ==; দেখতে pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html
চার্লস ডাফি

4
এছাড়াও, grep 'string' &>/dev/nullউভয় অ POSIX অনুবর্তী হয় এবং অনেক ধীর চালানো (যদি stringপ্রদর্শিত হয় একটি দীর্ঘ আউটপুট প্রবাহে গোড়ার দিকে) তুলনায় grep -q string। [আপনি যদি নিশ্চিত হতে চান যে somecommandনির্গমন হওয়ার পরেও চলমান থাকে string, তবে এর ক্ষেত্রে grep -qস্ট্যান্ডিন বন্ধ করে এবং প্রথম stringদৃষ্টিতে দেখা হওয়ার পরে বেরিয়ে এসে - প্রতিবাদকারী হতে পারে] (পুনরায়: "নন- পসিক্স - সম্মতিযুক্ত ", &>এটি একটি এক্সটেনশন - পবস.ওপেনগ্রুপ.org/onlinepubs/009695399/utilities /… দেখুন পসিক্স - আদেশযুক্ত পুনঃনির্দেশ সমর্থনটি বর্ণনা করে)।
চার্লস ডাফি

যদি প্রতিটি প্যারামিটার সিনট্যাক্সের সম্পূর্ণ বোঝার জন্য উত্সাহিত করতে / কেন কাজ করে / কী কাজ করে তা ব্যাখ্যা করা হয়েছিল
redfox05

157

পরীক্ষা $?করা একটি অ্যান্টি-প্যাটার্ন

if ./somecommand | grep -q 'string'; then
  echo "matched"
fi

কোনো সুযোগ দ্বারা আপনি শুধুমাত্র একটি নির্দিষ্ট স্ট্রিং পরীক্ষা করতে চান তাহলে, যোগ এফ এবং এক্স বিকল্পগুলি: grep -Fxq এফ সংশোধন (ব্যাখ্যা নয়) এবং ঘোরা এক্স পুরো লাইন জন্য
Erdal জি

4
কেন পরীক্ষা $?- নিরীক্ষা বিরোধী?
ভাইটালি জেডনেভিচ

1
@ ভিটিলিজেডেনেভিচ আমি ধরে নিচ্ছি কারণ এটি চুক্তির তুলনায় দৃ .় নয়।
Konrad Reiche

@ ভিটালিজেডানেভিচ, একের জন্য, পরীক্ষাগুলি $?পূর্ববর্তী কমান্ডগুলিকে "পরীক্ষিত" হিসাবে set -eবা ERRফাঁদ দেওয়ার উদ্দেশ্যে সেট করে না , সুতরাং আপনার প্রোগ্রামটি এমন ক্ষেত্রে প্রস্থান করতে পারে যেখানে আপনি ইচ্ছাকৃতভাবে-মিথ্যা পথে পরে ফিরে যেতে চান। অন্যটির জন্য, $?এটি অস্থির বিশ্বব্যাপী রাষ্ট্র - দুর্ঘটনাক্রমে এটির মূল্য ফেলে দেওয়া সহজ। উদাহরণস্বরূপ, আপনি যদি লগিংয়ের মতো একটি লাইন যুক্ত করেন echo "Exit status is $?"তবে নতুন মানটি $?এর প্রস্থান স্থিতিতে পরিণত হয় echo
চার্লস ডাফি

6

আর একটি বিকল্প হ'ল কমান্ড আউটপুটে নিয়মিত এক্সপ্রেশন ম্যাচের জন্য পরীক্ষা করা।

উদাহরণ স্বরূপ:

[[ "$(./somecommand)" =~ "sub string" ]] && echo "Output includes 'sub string'"

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