বাশ-এ "if" স্টেটমেন্টের জন্য একটি "এবং" অপারেটর


168

আমি ওয়েবসাইটটি বন্ধ আছে কিনা এবং কিছু কারণে "এবং" অপারেটর কাজ করে না তা যাচাই করার জন্য একটি সরল বাশ স্ক্রিপ্ট তৈরি করার চেষ্টা করছি:

#!/usr/bin/env bash

WEBSITE=domain.com
SUBJECT="$WEBSITE DOWN!"
EMAILID="an@email.com"
STATUS=$(curl -sI $WEBSITE | awk '/HTTP\/1.1/ { print $2 }')
STRING=$(curl -s $WEBSITE | grep -o "string_to_search")
VALUE="string_to_search"

if [ $STATUS -ne 200 ] && [[ "$STRING" != "$VALUE" ]]; then
    echo "Website: $WEBSITE is down, status code: '$STATUS' - $(date)" | mail -s "$SUBJECT" $EMAILID
fi

"-A" অপারেটরটিও কাজ করে না:

if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]

আপনি যখন দয়া করে পরামর্শ দিতে পারেন:

  • একক এবং ডাবল বর্গাকার বন্ধনী
  • প্রথম বন্ধনী

?


3
আপনি কি "কাজ করে না" সম্পর্কে আরও সুনির্দিষ্ট হতে পারেন? আপনার একটি নির্দিষ্ট ত্রুটি বার্তা আছে, বা কেবল প্রত্যাশিত আউটপুট সরবরাহ করা হয় না?
জুলিয়ান ভিভনট

আমি আসলে "আনারি অপারেটর প্রত্যাশিত" পেয়েছিলাম তাই দেখে মনে হচ্ছে উদ্ধৃতি সাহায্য করে
এইচটিএফ

-aসদৃশতা আছে যখন বোর্ন শেল শৈলী সঙ্গে ব্যবহার testকমান্ড, ওরফে [তার মানে andশর্তসাপেক্ষ অভিব্যক্তি হিসাবে যখন ব্যবহৃত হয় তখন কোনও ফাইল বিদ্যমান কিনা তা পরীক্ষা করে দেখানো হচ্ছে। হ্যাঁ এটি বিভ্রান্তিকর, সেরা এড়ানো।
সিডারকে

উত্তর:


254

আপনার যা আছে ${STATUS}তা খালি না হলে কাজ করা উচিত । এটি করা আরও ভাল হবে:

if ! [ "${STATUS}" -eq 200 ] 2> /dev/null && [ "${STRING}" != "${VALUE}" ]; then

অথবা

if [ "${STATUS}" != 200 ] && [ "${STRING}" != "${VALUE}" ]; then

এটি বলা শক্ত, যেহেতু আপনি আমাদের স্ক্রিপ্টটির সাথে কী ভুল হচ্ছে তা আপনি আমাদের সঠিকভাবে দেখান নি।

ব্যক্তিগত মতামত: কখনও ব্যবহার করবেন না [[। এটি গুরুত্বপূর্ণ ত্রুটি বার্তাগুলি দমন করে এবং বিভিন্ন শেলের কাছে বহনযোগ্য নয়।


2
যদি STATUSখালি থাকে তবে @ এইচটিএফ থেকে কোডটি ব্যর্থ হত -ne: unary operator expected। আপনার ক্ষেত্রে, এটি ব্যর্থ হবে integer expression expected, তাই না?
জুলিয়ান ভিভনোট

1
আমি বুঝতে পারি যে. তবে আপনি এই সমস্যাটি হাইলাইট করুন যা $STATUSখালি হতে পারে এবং একটি সমাধানের প্রস্তাব দেয় (এটি উদ্ধৃত করে)। আপনার সমাধানটি এখনও খালি নিয়ে ব্যর্থ হয় STATUS, এটাই আমি বোঝাতে চাইছি।
জুলিয়ান ভিভনোট

1
@jvivenot আপনার একটি বিষয় আছে । (আপনার মন্তব্যের আমার প্রতিক্রিয়া আগে আপনি আপনার মন্তব্য, যখন আপনার মন্তব্য নিছক পড়া সম্পাদিত "কোড ... ব্যর্থ হয়ে যেত" একজন সহজ সমাধান ব্যবহার করা হয়েছিল ${STATUS:-0"।। উইল সম্পাদন করা
উইলিয়াম Pursell

দুঃখিত, আপনার সম্পাদনা এখনও কাজ করে না। উদাহরণস্বরূপ: STATUS=; [ $STATUS -ne 13 ] 2>/dev/null && echo fooআউটপুট দেয় না foo, যদিও এটি হওয়া উচিত (খালিটি 13 থেকে পৃথক)। আপনি প্রথমে যা পরামর্শ দিয়েছেন, এটি ${STATUS:-0}আরও ভাল দেখায়।
জুলিয়ান ভিভনোট

@jvivenot ব্যবহার ${STATUS:-0}ব্যর্থ হবে STATUS=foo, তবে ! [ "$STATUS" -eq 200 ] 2> /dev/null && echo fooকাজ করে। আইএমও, তবে এড়ানো -eqএবং ব্যবহার করা ভাল !=
উইলিয়াম পার্সেল

28

এটা চেষ্টা কর:

if [ $STATUS -ne 200 -a "$STRING" != "$VALUE" ]; then

আমার জন্য কাজ। আমি মনে করি একাধিক উপায় থাকতে পারে তবে আপাতত আমি এতে সন্তুষ্ট।
কুশল অশোক


12

উদ্ধৃতি:

"-A" অপারেটরটিও কাজ করে না:

যদি [AT STATUS -ne 200] -a [["" $ STRING "! =" $ মান "]]

আরও বিস্তৃত ব্যাখ্যার জন্য: [এবং ]বাশ সংরক্ষিত শব্দ নয়। ifশব্দ প্রবর্তন একটি শর্তাধীন (শর্তসাপেক্ষ সত্য চাকরি দ্বারা মূল্যায়ন করা হলে কাজ ফিরে মান0 বা মিথ্যা অন্যথায়)।

তুচ্ছ পরীক্ষার জন্য, testপ্রোগ্রাম রয়েছে (man test ) রয়েছে।

if test -f filename; then foo bar; fiবেশিরভাগ সিস্টেমে আপনি বিরক্তিকর, ইত্যাদির মতো লাইনগুলি খুঁজে পাওয়ার সাথে সাথে আপনি এমন একটি প্রোগ্রাম পান [যা প্রকৃতপক্ষে testপ্রোগ্রামটির কেবল একটি সিমলিংক । যখন testহিসাবে ডাকা হয় [, আপনাকে যুক্ত করতে হবে] সর্বশেষ অবস্থানগত যুক্তি হিসাবে ।

তাই if test -f filenameমূলত একই হিসাবে (উত্পন্ন হওয়া প্রসেস পরিপ্রেক্ষিতে) হল if [ -f filename ]। উভয় ক্ষেত্রেtest প্রোগ্রামটি শুরু হবে, এবং উভয় প্রক্রিয়া একইরকম আচরণ করা উচিত।

আপনার ভুলটি এখানে: job কিছু কাজকে if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]বিশ্লেষণ করবে if, কাজটি ifনিজে ছাড়া সমস্ত কিছু । কাজটি কেবল একটি সরল কমান্ড (বাশ এমন কোনও কিছুর জন্য কথা বলে যার ফলস্বরূপ একক প্রক্রিয়া ঘটে) যার অর্থ প্রথম শব্দ ( [) হ'ল আদেশ এবং বাকীটি এর অবস্থানগত যুক্তি। প্রথমটির পরে বাকি যুক্তি রয়েছে]

এছাড়াও নয়, [[প্রকৃতপক্ষে একটি বাশ কীওয়ার্ড, তবে এই ক্ষেত্রে এটি কেবলমাত্র একটি সাধারণ কমান্ড যুক্তি হিসাবে পার্স করা হয়েছে, কারণ এটি কমান্ডের সামনের অংশে নেই।

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