नेग स्क्रिप्ट में शर्त अगर नेगेट


162

मैं बैश करने के लिए नया हूं और मैं निम्नलिखित कमांड को नकारने की कोशिश कर रहा हूं:

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
        echo "Sorry you are Offline"
        exit 1

अगर मैं इंटरनेट से जुड़ा हुआ हूं तो यह शर्त सही है। मैं चाहता हूं कि यह दूसरे तरीके से हो, लेकिन !कहीं भी काम करने के लिए नहीं लगता है।


3
आपने इसे कहाँ डाल दिया था? if ! [[ ...काम करता है
अन्य आदमी

1
आप इसे इस तरह भी इस्तेमाल कर सकते हैं: wget your_xxxx_params || (गूंज "ओह ओह" && निकास 1)
AKS

2
> एक
सबमिशन

जवाबों:


227

आप चुन सकते हैं:

if [[ $? -ne 0 ]]; then       # -ne: not equal

if ! [[ $? -eq 0 ]]; then     # -eq: equal

if [[ ! $? -eq 0 ]]; then

! क्रमशः निम्नलिखित अभिव्यक्ति की वापसी को प्रभावित करता है।


9
क्या डबल ब्रैकेट आवश्यक हैं? ऐसा क्यों है?
अलेक्जेंडर मिल्स

1
@AlexanderMills: ऐसा करने के कई तरीके हैं। डबल या सिंगल ब्रैकेट के साथ या testकमांड के साथ :if test $? -ne 0; then
साइरस 18

4
यह उत्तर अनावश्यक क्रिया है। ifएक कथन की उम्मीद है जो या तो 0 या 1 है, इसलिए आप कमांड का उपयोग स्वयं कर सकते हैं और इसे उल्टा कर सकते हैं:if ! wget ...; then ...; fi
निल्स मैग्नस

87

बेहतर

if ! wget -q --spider --tries=10 --timeout=20 google.com
then
  echo 'Sorry you are Offline'
  exit 1
fi

1
महत्वपूर्ण: !निम्न और निम्न आदेश के बीच एक स्थान रखें अन्यथा आप एक इतिहास विस्तार कर रहे होंगे। unix.stackexchange.com/questions/3747/…
रोलैंड

2
स्टीवन क्यों आप केवल 1 प्रतिष्ठा है?
रोलैंड

8

यदि आप आलसी महसूस कर रहे हैं, तो ऑपरेशन के बाद ||(या) और &&(और) का उपयोग करने की परिस्थितियों को संभालने की एक कठिन विधि है :

wget -q --tries=10 --timeout=20 --spider http://google.com || \
{ echo "Sorry you are Offline" && exit 1; }

8
वास्तविक जीवन की लिपियों में आपको &&एको कमांड के बाद एक में बदलना चाहिए ;। इसका कारण यह है कि अगर आउटपुट को एक पूर्ण डिस्क पर एक फ़ाइल पर पुनर्निर्देशित किया जा रहा है, तो echoविफलता वापस आ जाएगी और exitकभी भी आग नहीं लगेगी। यह संभवतः वह व्यवहार नहीं है जो आप चाहते हैं।
स्कोर_उंडर

या फिर आप उपयोग कर सकते हैं set -eऔर असफल echoहो सकते हैं वैसे भी स्क्रिप्ट से बाहर निकल जाएंगे
जैकब बोचेंस्की

4

चूंकि आप संख्याओं की तुलना कर रहे हैं, आप एक अंकगणितीय अभिव्यक्ति का उपयोग कर सकते हैं , जो मापदंडों और तुलना की सरल हैंडलिंग के लिए अनुमति देता है:

wget -q --tries=10 --timeout=20 --spider http://google.com
if (( $? != 0 )); then
    echo "Sorry you are Offline"
    exit 1
fi

ध्यान दें कि इसके बजाय -neआप कैसे उपयोग कर सकते हैं !=। एक अंकगणितीय संदर्भ में, हमें $मापदंडों के लिए भी प्राथमिकता नहीं देनी चाहिए,

var_a=1
var_b=2
(( var_a < var_b )) && echo "a is smaller"

पूरी तरह से ठीक काम करता है। यह $?विशेष पैरामीटर के लिए उपयुक्त नहीं है, हालांकि।

आगे, चूंकि (( ... ))गैर-शून्य मानों का सही मूल्यांकन करता है, अर्थात, शून्य-शून्य मानों के लिए 0 की वापसी स्थिति और 1 की वापसी स्थिति है, अन्यथा हम छोटा कर सकते हैं

if (( $? )); then

लेकिन इससे अधिक लोगों को भ्रमित किया जा सकता है कि बचाए गए कीस्ट्रोक्स की तुलना में अधिक लोग लायक हैं।

(( ... ))निर्माण बैश में उपलब्ध है, लेकिन वजह से नहीं POSIX खोल विनिर्देश (हालांकि, संभव विस्तार के रूप में उल्लेख किया है)।

यह सब कहा जा रहा है, यह $?मेरी राय में पूरी तरह से बचने के लिए बेहतर है , जैसा कि कोल के जवाब और स्टीवन के जवाब में है



@ DavidC.Rankin ओह, मुझे वह नहीं मिला! इसलिए इसका विस्तार के रूप में उल्लेख किया गया है, लेकिन इसकी आवश्यकता नहीं है। मैं संशोधन करूंगा।
बेंजामिन डब्ल्यू।

1
हां, वह हमेशा मुझे भी मिला। यह सुनिश्चित करता है कि शेल में जीवन आसान हो जाता है:)
डेविड सी। रंकिन

4

आप -neइसके बजाय असमान तुलना का उपयोग कर सकते हैं -eq:

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -ne 0 ]]; then
    echo "Sorry you are Offline"
    exit 1
fi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.