नेग में पाश हालत जबकि नेगेट


25

जिस स्क्रिप्ट पर मैं काम कर रहा हूं, उसके भाग में, मैं यह सत्यापित करना चाहता हूं कि इनपुट आईपी पता सही प्रारूप में है। मैं एक लूप बनाना चाहता हूं, जबकि इनपुट प्रारूप सही नहीं है। निम्नलिखित एक लूप के लिए काम करता है, जबकि प्रारूप आईएस सही है।

while  [[  $range =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ]]
      do

मैं यह कैसे कह सकता हूं कि प्रारूप फिट नहीं है। मैं उम्मीद कर रहा था कि !=~काम करेंगे, लेकिन मुझे एक सिंटैक्स त्रुटि मिल रही है।


2
Synner, सावधानी का एक नोट: जबकि यह स्पष्ट है कि आप एक इंटरैक्टिव स्क्रिप्ट लिख रहे हैं, शेल स्क्रिप्टिंग की अपार शक्ति समान स्क्रिप्ट के साथ समान रूप से और बैच मोड में समान कार्य करने में सक्षम होने से आती है। यह निश्चित रूप से भविष्य में आसान होगा (जब आप स्क्रिप्ट को एक बिल्डिंग ब्लॉक के रूप में उपयोग करना शुरू करते हैं) केवल कमांड लाइन में विकल्प दर्ज करने के लिए और कुछ भी गलत न होने पर एक गैर-शून्य निकास कोड (और एक संदेश) के साथ तुरंत वापस लौटें। बस मेरे 2 सेंट ...
हिरण

जवाबों:


60

समाधान इतना आसान है, मुझे यकीन है कि आप सभी इसे अजीब पाएंगे।

नकारात्मक सिंटैक्स विवरण के बारे में काम करने की आवश्यकता नहीं है, बस untilइसके बजाय उपयोग करें while


9

स्ट्रिंग की तुलना के लिए, के !=बजाय का उपयोग करना चाहिए !=~

से man bash

string1 != string2
          True if the strings are not equal.

जैसा कि आप दाईं ओर एक नियमित अभिव्यक्ति का उपयोग कर रहे हैं, आपको वास्तव में आवश्यकता है =~। आप पूरी अभिव्यक्ति को नकारने के लिए चुन सकते हैं।

while  [[  !( $range =~ ^[0-9]{1,3]}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ) ]]

उदाहरण:

$ bash --version | head -n1
GNU bash, version 4.2.24(1)-release (x86_64-pc-linux-gnu)
$ cat script
range='1'; while [[ !( $range =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ) ]]; do echo "$range NOT OK"; range+='.2'; sleep 1; done
echo "Finished"
$ bash script
1 NOT OK
1.2 NOT OK
1.2.2 NOT OK
Finished
$ 

त्वरित प्रतिक्रिया के लिए धन्यवाद। मैंने कोशिश की है कि पोस्ट करने से पहले, और यह ठीक से मान्य नहीं होता है। ऐसा लगता है कि ~ को ठीक से काम करने की आवश्यकता है जब यह पुष्टि करता है कि यह प्रारूप फिट है।
सिनियर

@ साइनर एडिट
बर्नहार्ड

bash4.2.42 के साथ काम नहीं करता है । pastebin.com/0vHh5MMB
मैनेटवर्क

1
@manatwork एक गैर-इंटरैक्टिव शेल में प्रयास करें।
बर्नहार्ड

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