bash - কিভাবে "সত্য শর্ত না হলে"?




if-statement syntax (4)

cat /etc/passwd | grep "sysa" যখন আমি echo কমান্ডটি চালিত করতে চাই cat /etc/passwd | grep "sysa" সত্য নয়।

আমি কি ভুল করছি?

if ! [ $(cat /etc/passwd | grep "sysa") ]; then
        echo "ERROR - The user sysa could not be looked up"
        exit 2
fi

আমি কি ভুল করছি?

$(...) মূল্য বহন করে, প্রস্থান অবস্থা নয়, সেই কারণে এই পদ্ধতিটি ভুল। যাইহোক, এই নির্দিষ্ট ক্ষেত্রে, এটি প্রকৃতপক্ষে কাজ করে কারণ sysa মুদ্রণ করা হবে যা পরীক্ষা বিবৃতিটিকে সত্য বলে দেয়। যাইহোক, if ! [ $(true) ]; then echo false; fi if ! [ $(true) ]; then echo false; fi if ! [ $(true) ]; then echo false; fi সবসময় false মুদ্রণ করবে কারণ true কমান্ড stdout তে কিছু লিখছে না (যদিও প্রস্থান কোডটি 0 হয়)। এভাবেই যদি এটিকে পুনরুজ্জীবিত করা দরকার if ! grep ...; then if ! grep ...; then if ! grep ...; then

একটি বিকল্প cat /etc/passwd | grep "sysa" || echo error cat /etc/passwd | grep "sysa" || echo error cat /etc/passwd | grep "sysa" || echo error । সম্পাদনা: যেমন অ্যালেক্স উল্লেখ করেছেন, বিড়াল এখানে বেহুদা : grep "sysa" /etc/passwd || echo error grep "sysa" /etc/passwd || echo error

বরং অন্যান্য বিভ্রান্তিকর উত্তর পাওয়া, আশা করি এই কেউ সাহায্য করে।


আমি এটা সহজ করা যেতে পারে মনে হয়:

grep sysa /etc/passwd || {
    echo "ERROR - The user sysa could not be looked up"
    exit 2
}

অথবা একটি একক কমান্ড লাইন

$ grep sysa /etc/passwd || { echo "ERROR - The user sysa could not be looked up"; exit 2; }


চেষ্টা

if ! grep -q sysa /etc/passwd ; then

grep true সন্ধান করে, যদি এটি অনুসন্ধানের লক্ষ্য খুঁজে পায় এবং এটি না হলে false হয়।

সুতরাং false == true

শেলে মূল্যায়ন খুব নমনীয় হতে ডিজাইন করা হয়, এবং অনেক বার কমান্ডের চেইন প্রয়োজন হয় না (আপনি লিখেছেন হিসাবে)।

এছাড়াও, আপনার কোডটি দেখছেন, আপনার $( ... ) সিএমডি-প্রতিস্থাপন ফর্মের $( ... ) ফর্মটি প্রশংসা করা উচিত, তবে প্রক্রিয়াটির বাইরে কী হচ্ছে তা নিয়ে চিন্তা করুন। আমি কি বলতে চাই তা দেখতে echo $(cat /etc/passwd | grep "sysa") চেষ্টা করুন। আপনি grep এর -c (গণনা) বিকল্পটি ব্যবহার করে এটি আরও নিতে পারেন এবং তারপর যদি if ! [ $(grep -c "sysa" /etc/passwd) -eq 0 ] ; then if ! [ $(grep -c "sysa" /etc/passwd) -eq 0 ] ; then if ! [ $(grep -c "sysa" /etc/passwd) -eq 0 ] ; then কাজ করে কিন্তু পুরানো স্কুল।

কিন্তু, আপনি নতুন শেল বৈশিষ্ট্যগুলি (গাণিতিক মূল্যায়ন) ব্যবহার করতে পারেন

if ! (( $(grep -c "sysa" /etc/passwd) == 0 )) ; then ...`

যা আপনাকে সি-ল্যাং ভিত্তিক তুলনা অপারেটরগুলির ব্যবহার করার সুবিধা দেয়, ==,<,>,>=,<=,% এবং সম্ভবত কয়েকজন।

এই ক্ষেত্রে, Orwellophile দ্বারা একটি মন্তব্য প্রতি, গাণিতিক মূল্যায়ন এমনকি আরও নিচে নত করা যেতে পারে, মত

if ! (( $(grep -c "sysa" /etc/passwd) )) ; then ....

অথবা

if (( ! $(grep -c "sysa" /etc/passwd) )) ; then ....

অবশেষে, Useless Use of Cat (UUOC) নামে একটি পুরস্কার রয়েছে । :-) কিছু মানুষ লাফিয়ে উঠবে এবং গথকা কাঁদবে! আমি শুধু বলব যে grep তার cmd-line এ একটি ফাইলের নাম নিতে পারে, তাই আপনাকে অতিরিক্ত প্রসেস এবং পাইপ নির্মাণের দরকার নেই কেন? ;-)

আশা করি এটা কাজে লাগবে.


এখানে উদাহরণ দিয়ে একটি উত্তর:

ডেটা লোগোগুলি অনলাইনে নিশ্চিত করার জন্য cron স্ক্রিপ্টটি এমন 15 মিনিটের মত দেখায় যা এই রকম দেখায়:

#!/bin/bash
#
if ! ping -c 1 SOLAR &>/dev/null
then
  echo "SUBJECT:  SOLAR is not responding to ping" | ssmtp [email protected].com
  echo "SOLAR is not responding to ping" | ssmtp [email protected].att.com
else
  echo "SOLAR is up"
fi
#
if ! ping -c 1 OUTSIDE &>/dev/null
then
  echo "SUBJECT:  OUTSIDE is not responding to ping" | ssmtp [email protected].com
  echo "OUTSIDE is not responding to ping" | ssmtp [email protected].att.com
else
  echo "OUTSIDE is up"
fi
#

... এবং তাই প্রতিটি ডেটা লগারের জন্য আপনি http://www.sDsolarBlog.com/montageমন্টেজটিতে দেখতে পারেন

FYI, ব্যবহার করে &>/dev/null কমান্ড থেকে সমস্ত আউটপুট পুনঃনির্দেশ করে, ত্রুটি সহ, /dev/null

(শর্তাধীন শুধুমাত্র ping কমান্ড exit status প্রয়োজন)

এছাড়াও FYI, নোট করুন যে cron কাজ root হিসাবে চালানোর কারণে cron স্ক্রিপ্টে sudo ping ব্যবহার করার প্রয়োজন নেই।





boolean-expression