दिलचस्प पोस्ट
Async-await on .net 4 का उपयोग करना सीएसएस मिनेफ़ायर के लिए कोई सिफारिशें? स्विफ्ट: गार्ड बनाम अगर चलो मैं Vb.NET या C # का उपयोग कर एक प्रक्रिया को कैसे मारूं? असतत एक्स पैमाने का क्रम बदलें लंबी आज्ञाएं Windows Vista बैच (.bat) फ़ाइल में कई पंक्तियों से विभाजित होती हैं अक्ष टिक्स की संख्या में वृद्धि प्रधानमंत्री संख्याओं को खोजने के लिए सबसे तेज़ एल्गोरिथ्म कौन सा है? पाठ इनपुट क्षेत्र में कर्सर स्थिति (वर्णों में) प्राप्त करें गोलाकार कोनों के साथ संपादन टेक्स्ट कैसे बनाएं? प्रोटोकॉल का आनंद क्या SQLite डेटाबेस में एक समय में एकाधिक पंक्तियाँ सम्मिलित करना संभव है? क्या एक एचटीएमएल फॉर्म में स्वत: पूर्ण को अक्षम करने के लिए कोई W3C वैध तरीका है? मूल ग्राफ़िक्स में प्लॉटिंग क्षेत्र के बाहर एक किंवदंती बनाएं? अच्छा जावा ग्राफ एल्गोरिथ्म पुस्तकालय?

बाश में, मैं कैसे जांच सकता हूँ अगर कोई स्ट्रिंग कुछ मान से शुरू होती है?

मैं यह जांचना चाहूंगा कि कोई स्ट्रिंग "नोड" जैसे "नोड 001" के साथ शुरू होती है। कुछ इस तरह

if [ $HOST == user* ] then echo yes fi 

मैं इसे सही ढंग से कैसे कर सकता हूं?


मुझे इस बात की जांच करने की आवश्यकता है कि क्या HOST या तो "user1" है या "नोड"

 if [ [[ $HOST == user1 ]] -o [[ $HOST == node* ]] ]; then echo yes fi > > > -bash: [: too many arguments 

इसे सही तरीके से कैसे करें?

वेब के समाधान से एकत्रित समाधान "बाश में, मैं कैसे जांच सकता हूँ अगर कोई स्ट्रिंग कुछ मान से शुरू होती है?"

उन्नत बैश स्क्रिप्टिंग गाइड पर यह स्निपेट कहता है:

 # The == comparison operator behaves differently within a double-brackets # test than within single brackets. [[ $a == z* ]] # True if $a starts with a "z" (wildcard matching). [[ $a == "z*" ]] # True if $a is equal to z* (literal matching). 

तो आप इसे लगभग सही था; आपको डबल ब्रैकेट की आवश्यकता है, न कि एकल कोष्ठक।


अपने दूसरे प्रश्न के संबंध में, आप इसे इस तरह से लिख सकते हैं:

 HOST=user1 if [[ $HOST == user1 ]] || [[ $HOST == node* ]] ; then echo yes1 fi HOST=node001 if [[ $HOST == user1 ]] || [[ $HOST == node* ]] ; then echo yes2 fi 

कौन इको करेगा

 yes1 yes2 

बैश का उपयोग करने के लिए सिंटैक्स मुश्किल है (आईएमओ)

यदि आप एक हाल ही में बाश (v3 +) का उपयोग कर रहे हैं तो बैश रेगेक्स तुलना ऑपरेटर =~ , यानी, सुझाव दें

 if [[ "$HOST" =~ ^user.* ]]; then echo "yes" fi 

इसका मिलान this or that एक regex उपयोग में | , अर्थात

 if [[ "$HOST" =~ ^user.*|^host1 ]]; then echo "yes" fi 

नोट – यह 'उचित' नियमित अभिव्यक्ति वाक्यविन्यास है

  • user* का use और r शून्य या अधिक घटनाओं का मतलब है, तो use और userrrr मैच होगा।
  • user.* मतलब है user और किसी भी चरित्र के शून्य या अधिक घटनाओं, तो user1 , userX मैच होगा।
  • ^user.* $ HOST की शुरुआत में पैटर्न user.* मेल खाता है।

यदि आप नियमित अभिव्यक्ति वाक्यविन्यास से परिचित नहीं हैं, तो इस संसाधन का संदर्भ दें।

नोट – यह बेहतर है यदि आप प्रत्येक नए प्रश्न को एक नए प्रश्न के रूप में पूछते हैं, तो स्टैक ओवरफ्लो टिडिएर और अधिक उपयोगी होते हैं। संदर्भ के लिए आप एक लिंक को वापस पिछले प्रश्न पर वापस जोड़ सकते हैं।

मैं पहले से पोस्ट की गई अन्य विधियों को पसंद करता हूं, लेकिन कुछ लोग इसका उपयोग करना पसंद करते हैं:

 case "$HOST" in user1|node*) echo "yes";; *) echo "no";; esac 

संपादित करें:

मैंने ऊपर दिए गए केस स्टेटमेंट में आपके विकल्प जोड़े हैं I

आपके संपादित संस्करण में आपके पास बहुत अधिक कोष्ठक हैं इसे ऐसा दिखना चाहिए:

 if [[ $HOST == user1 || $HOST == node* ]]; 

आप उस स्ट्रिंग का केवल भाग चुन सकते हैं जिसे आप देखना चाहते हैं:

 if [ ${HOST:0:4} = user ] 

आपके अनुवर्ती प्रश्न के लिए, आप OR :

 if [[ $HOST == user1 || $HOST == node* ]] 

मैं हमेशा स्प्टीटिंग के मुख्य बिंदुओं में से एक पोर्टेबिलिटी के बाद से, बॉश एक्सटेंशन का उपयोग करने के बजाय POSIX sh से छड़ी करने की कोशिश करता हूं। (कार्यक्रमों को जोड़ने के अलावा, उनके स्थान पर नहीं)

श में, "आइफिफ़िक्स" स्थिति की जांच करने का एक आसान तरीका है

 case $HOST in node*) your code here esac 

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

 if case $HOST in node*) true;; *) false;; esac; then your code here fi 

या छोटा भी

 if case $HOST in node*) ;; *) false;; esac; then your code here fi 

या इससे भी कम (केवल पेश करने के लिए ! भाषा तत्व के रूप में – लेकिन यह अब खराब शैली है)

 if ! case $HOST in node*) false;; esac; then your code here fi 

यदि आप स्पष्ट रूप से पसंद करते हैं, तो अपने स्वयं के भाषा तत्व बनाएं:

 beginswith() { case $2 in "$1"*) true;; *) false;; esac; } 

वास्तव में यह बहुत अच्छा नहीं है?

 if beginswith node "$HOST"; then your code here fi 

और जब से sh मूलतः केवल नौकरियों और स्ट्रिंग-सूचियों (और आंतरिक प्रक्रियाएं, जिनमें से नौकरियां बनायी जाती हैं), अब हम कुछ हल्का कार्यात्मक प्रोग्रामिंग भी कर सकते हैं:

 beginswith() { case $2 in "$1"*) true;; *) false;; esac; } checkresult() { if [ $? = 0 ]; then echo TRUE; else echo FALSE; fi; } all() { test=$1; shift for i in "$@"; do $test "$i" || return done } all "beginswith x" x xy xyz ; checkresult # prints TRUE all "beginswith x" x xy abc ; checkresult # prints FALSE 

यह सुरुचिपूर्ण है ऐसा नहीं है कि मैं कुछ गंभीर के लिए sh का उपयोग करने की वकालत करता हूं – यह असली दुनिया की आवश्यकताओं पर बहुत जल्दी तोड़ता है (कोई लैम्ब्डा नहीं, इसलिए स्ट्रिंग्स का उपयोग करना चाहिए। लेकिन स्ट्रिंग के साथ घोंसले के शिकार फ़ंक्शन कॉल करना संभव नहीं है, पाइप संभव नहीं हैं …)

चूंकि # का अर्थ बश में है I में निम्नलिखित समाधान मिला।
इसके अतिरिक्त मुझे रिक्त स्थान पर काबू पाने के लिए "" के साथ स्ट्रिंग पैक करने में अधिक पसंद है।

 A="#sdfs" if [[ "$A" == "#"* ]];then echo "skip comment line" fi 

हालांकि मुझे सबसे अधिक सटीक उत्तर यहां मिले हैं, उनमें से बहुत से अनावश्यक बाशियां हैं POSIX पैरामीटर विस्तार आपको सभी की आवश्यकता देता है:

 [ "${host#user}" != "${host}" ] 

तथा

 [ "${host#node}" != "${host}" ] 

${var#expr} ${var} से सबसे छोटा उपसर्ग मिलान expr स्ट्रिप्स और वह देता है। इसलिए यदि ${host} user ( node ) के साथ शुरू नहीं होता है, ${host#user} ( ${host#node} ) ${host}

expr fnmatch() वाइल्डकार्ड की अनुमति देता है, इस प्रकार ${host#node??} और दोस्त भी काम करते हैं।

@OP, अपने दोनों प्रश्नों के लिए आप केस / एएसएसी का उपयोग कर सकते हैं

 string="node001" case "$string" in node*) echo "found";; * ) echo "no node";; esac 

दूसरा सवाल

 case "$HOST" in node*) echo "ok";; user) echo "ok";; esac case "$HOST" in node*|user) echo "ok";; esac 

या बाश 4.0

 case "$HOST" in user) ;& node*) echo "ok";; esac 
 if [ [[ $HOST == user1 ]] -o [[ $HOST == node* ]] ]; then echo yes fi 

काम नहीं करता है, क्योंकि सभी [ , [[ और परीक्षण एक ही गैर-अनुक्रमिक व्याकरण को पहचानते हैं अपने बाश मैन पेज में कंडिशनल एक्सपेरशन देखें

एक तरफ, SUSV3 कहते हैं

कॉर्नशेल-व्युत्पन्न सशर्त कमांड (डबल ब्रैकेट [[]] ) को शेल कमांड भाषा के विवरण से प्रारंभिक प्रस्ताव में हटा दिया गया था। आपत्तियों को उठाया गया कि वास्तविक समस्या का परीक्षण आदेश ( [] का दुरुपयोग है, और उसे खोल में डाल देना समस्या को ठीक करने का गलत तरीका है। इसके बजाय, उचित दस्तावेज और एक नया शैल आरक्षित शब्द ( ! ) पर्याप्त हैं

परीक्षण के त्रुटि-प्रवण -ओ फ्लैग का उपयोग करने के बजाय, टेस्ट कमांड और शेल तार्किकों के व्यक्तिगत चालानों के उपयोग से कई परीक्षण कार्यों की आवश्यकता होती है, जो परीक्षणों को खोल स्तर पर किया जा सकता है।

आपको इसे इस तरह लिखना होगा, लेकिन परीक्षण इसका समर्थन नहीं करता है:

 if [ $HOST == user1 -o $HOST == node* ]; then echo yes fi 

स्ट्रिंग समानता के लिए परीक्षण = उपयोग करता है, इससे भी महत्वपूर्ण यह पैटर्न मिलान का समर्थन नहीं करता है।

case / esac के पैटर्न मिलान के लिए अच्छा समर्थन है:

 case $HOST in user1|node*) echo yes ;; esac 

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

 case word in [(]pattern1) compound-list;; [[(]pattern[ | pattern] ... ) compound-list;;] ... [[(]pattern[ | pattern] ... ) compound-list] esac 

एक और चीज है जो आप कर सकते हैं वह cat है जिसे आप गूंज रहे हैं और inline cut -c 1-1 साथ पाइप