बैश में "अगर" कथन के लिए एक "और" ऑपरेटर


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
क्या आप अधिक सटीक हो सकते हैं जैसा कि "काम नहीं करता है"? क्या आपके पास एक विशिष्ट त्रुटि संदेश है, या बस अपेक्षित आउटपुट प्रदान नहीं करता है?
जूलियन विवेनॉट

मैं वास्तव में "यूनीरी ऑपरेटर अपेक्षित" प्राप्त कर रहा था, इसलिए यह उद्धृत करने में मदद करता है
HTF

-aदोहराव है। जब बॉर्न शैल शैली testकमांड, उर्फ ​​के साथ उपयोग किया जाता है [, तो इसका मतलब है and। जब एक सशर्त अभिव्यक्ति के रूप में उपयोग किया जाता है तो यह देखने के लिए परीक्षण होता है कि क्या कोई फ़ाइल मौजूद है। हाँ, यह भ्रामक है, सबसे अच्छा बचा है।
cdarke

जवाबों:


254

जब तक आपके पास काम होना चाहिए, जब तक ${STATUS}खाली न हो। यह करना बेहतर होगा:

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

या

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

यह कहना मुश्किल है, क्योंकि आपने हमें बिल्कुल नहीं दिखाया है कि आपकी स्क्रिप्ट में क्या गलत है।

व्यक्तिगत राय: कभी उपयोग न करें [[। यह महत्वपूर्ण त्रुटि संदेशों को दबा देता है और विभिन्न गोले के लिए पोर्टेबल नहीं है।


2
यदि STATUSखाली है, तो @HTF से कोड विफल हो जाता -ne: unary operator expected। आपके मामले में, यह विफल integer expression expectedहोगा, है ना?
जूलियन विवेनॉट

1
मैं समझता हूँ कि। लेकिन आप उस मुद्दे को उजागर करते हैं जो $STATUSखाली हो सकता है और समाधान का सुझाव दे सकता है (इसे उद्धृत करते हुए)। आपका समाधान अभी भी एक खाली के साथ विफल रहता है STATUS, यही सब मेरा मतलब है।
जुलिएन विवेनॉट

1
@jvivenot आपके पास एक बिंदु है। (आपकी टिप्पणी पर मेरी प्रतिक्रिया आपकी टिप्पणी संपादित करने से पहले की गई थी, जब आपकी टिप्पणी केवल "कोड ... पढ़ी गई थी" विफल रही है। एक सरल समाधान का उपयोग करना है ${STATUS:-0"। संपादित करेंगे।
विलियम पर्ससेल

क्षमा करें, आपका संपादन अभी भी काम नहीं कर रहा है। उदाहरण के लिए: 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काम करता है। IMO, हालांकि इससे बचना -eqऔर उपयोग करना बेहतर है !=
विलियम पर्ससेल

28

इसे इस्तेमाल करे:

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

मेरे लिए काम किया। मुझे लगता है कि एक से अधिक तरीके हो सकते हैं लेकिन मैं अभी इसके लिए संतुष्ट हूं।
कुशाल अशोक

27

इसे इस्तेमाल करे:

if [ ${STATUS} -ne 100 -a "${STRING}" = "${VALUE}" ]

या

if [ ${STATUS} -ne 100 ] && [ "${STRING}" = "${VALUE}" ]

सबसे साफ उदाहरण के लिए
पावेल किओच

12

उद्धरण:

"-A" ऑपरेटर भी काम नहीं करता है:

अगर [$ STATUS -ne 200] -a [["$ STRING"! = "$ VALUE"]]

अधिक विस्तृत विवरण के लिए: [और ]बैश आरक्षित शब्द नहीं हैं। ifकीवर्ड द्वारा प्रस्तुत एक सशर्त एक नौकरी से मूल्यांकन किया जाना (यदि काम दिया गया मान है सशर्त सच है 0या गलत अन्यथा)।

तुच्छ परीक्षणों के लिए, testकार्यक्रम है ( man test)।

के रूप में कुछ लाइनों की तरह लगता है if test -f filename; then foo bar; fi, आदि कष्टप्रद, अधिकांश प्रणालियों पर आप एक कार्यक्रम है, [जो वास्तव में केवल testकार्यक्रम के लिए एक सहानुभूति कहा जाता है पाते हैं । जब testकहा जाता है [, तो आपको ]अंतिम स्थिति तर्क के रूप में जोड़ना होगा ।

तो if test -f filenameमूल रूप से एक ही है (प्रक्रियाओं के संदर्भ में) if [ -f filename ]। दोनों ही मामलों में testकार्यक्रम शुरू किया जाएगा, और दोनों प्रक्रियाओं को समान रूप से व्यवहार करना चाहिए।

यहां आपकी गलती है: कुछ नौकरी, खुद के अलावा सब कुछ होने के if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]लिए if+ को पार्स करेगा if। काम केवल एक साधारण कमांड है (बैश कुछ के लिए बोलते हैं, जिसके परिणामस्वरूप एक ही प्रक्रिया होती है), जिसका अर्थ है पहला शब्द ( [) कमांड है और बाकी उसकी स्थिति संबंधी दलीलें हैं। पहले के बाद शेष तर्क हैं]

इसके अलावा, [[वास्तव में एक बैश कीवर्ड नहीं है, लेकिन इस मामले में इसे केवल एक सामान्य कमांड तर्क के रूप में रखा गया है, क्योंकि यह कमांड के सामने नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.