बैश ऑपरेटरों के बीच क्या अंतर है [[बनाम [बनाम (बनाम) (?


243

मैं थोड़ा उलझन में हूं कि ये ऑपरेटर बैश (ब्रैकेट, डबल ब्रैकेट, कोष्ठक और डबल कोष्ठक) में उपयोग किए जाने पर अलग तरीके से क्या करते हैं।

[[ , [ , ( , ((

मैंने देखा है कि अगर लोग इस तरह का बयान देते हैं, तो उनका इस्तेमाल करते हैं:

if [[condition]]

if [condition]

if ((condition))

if (condition)

4
आप को देखने के लिए चाहते हो सकता है unix.stackexchange.com/questions/tagged/test पहले
cuonglm


3
@cuonglm विडंबना क्योंकि लिंक इस परिणाम को पहले परिणाम के रूप में देता है। विरोधाभास!
इन्सेन

5
मुझे लगता है कि प्रलेखन पढ़ना एक विकल्प नहीं है?
ऑर्बिट

34
लघुकोष्ठक और कोष्ठक प्रलेखन में खोजना आसान नहीं है, और यदि आपके पास उन विशेषताओं के नाम नहीं हैं, तो आपके पास यह सब है।
इल्काचू

जवाबों:


255

ifआमतौर पर एक कथन जैसा दिखता है

if commands1
then
   commands2
else
   commands3
fi

thenअगर के निकास कोड खंड निष्पादित किया जाता है commands1शून्य है। यदि निकास कोड नॉनजरो है, तो elseक्लॉज निष्पादित किया जाता है। commands1सरल या जटिल हो सकता है। यह, उदाहरण के लिए, एक या अधिक पाइपलाइनों ऑपरेटरों में से एक के द्वारा अलग से एक दृश्य हो सकता है ;, &, &&, या ||ifनीचे दिखाया गया है की स्थिति का सिर्फ विशेष मामले हैं commands1:

  1. if [ condition ]

    यह पारंपरिक शेल testकमांड है। यह सभी POSIX गोले पर उपलब्ध है। परीक्षण कमांड एक निकास कोड निर्धारित ifकरता है और कथन तदनुसार कार्य करता है। विशिष्ट परीक्षण यह है कि क्या कोई फ़ाइल मौजूद है या एक संख्या दूसरे के बराबर है।

  2. if [[ condition ]]

    यह kshtest से एक नया उन्नत बदलाव है जो bash और zsh भी समर्थन करता है। यह कमांड एक एक्जिट कोड भी निर्धारित करता है और स्टेटमेंट उसी के अनुसार कार्य करता है। इसकी विस्तारित विशेषताओं के बीच, यह परीक्षण कर सकता है कि क्या एक स्ट्रिंग एक नियमित अभिव्यक्ति से मेल खाती है।testif

  3. if ((condition))

    एक और ksh एक्सटेंशन जो बैश और zsh भी सपोर्ट करता है। यह अंकगणित करता है। अंकगणित के परिणामस्वरूप, एक निकास कोड निर्धारित किया जाता है और ifकथन तदनुसार कार्य करता है। यदि अंकगणितीय गणना का परिणाम गैर-शून्य है, तो यह शून्य (सत्य) का निकास कोड देता है। जैसे [[...]], यह फ़ॉर्म POSIX नहीं है और इसलिए पोर्टेबल नहीं है।

  4. if (command)

    यह एक सबशेल में कमांड चलाता है। जब कमांड पूरी हो जाती है, तो यह एक निकास कोड सेट ifकरता है और कथन तदनुसार कार्य करता है।

    इस तरह एक उपखंड का उपयोग करने का एक विशिष्ट कारण commandयदि commandआवश्यक चर असाइनमेंट या शेल के वातावरण में अन्य परिवर्तनों के साइड-इफेक्ट्स को सीमित करना है। इस तरह के परिवर्तन उपधारा पूरा होने के बाद नहीं रहते हैं।

  5. if command

    कमांड निष्पादित होती है और ifस्टेटमेंट उसके एक्जिट कोड के अनुसार कार्य करता है।


24
5 वें विकल्प को शामिल करने के लिए धन्यवाद। यह समझने की कुंजी है कि यह वास्तव में कैसे काम करता है और आश्चर्यजनक रूप से कम किया गया है।
चूजों

4
ध्यान दें कि [वास्तव में एक बाइनरी है, न कि आंतरिक कमांड या प्रतीक। आम तौर पर में रहता है /bin
जुलिएन आर।

8
@JulienR। वास्तव [में एक अंतर्निहित है, जैसा है test। संगतता कारणों से बाइनरी संस्करण उपलब्ध हैं। बाहर की जाँच करें help [और help test
OldTimer

4
ध्यान देने योग्य बात यह है कि जब ((इसे POSIX नहीं है, वर्थ $((। यानी अंकगणित विस्तार है और यह उन्हें भ्रमित करने के लिए आसान है अक्सर एक वैकल्पिक हल कुछ का उपयोग करने के समान है [ $((2+2)) -eq 4 ]सशर्त बयान में गणित का उपयोग करने के
सर्गी Kolodyazhnyy

कैसे मज़ेदार मुद्रण नई लाइनें हैं if echo; then echo; fi:।
एंथनीडी 973 1

77
  • (…)कोष्ठक एक उपधारा इंगित करता है । उनके अंदर जो है वह अन्य भाषाओं की तरह अभिव्यक्ति नहीं है। यह आदेशों की एक सूची है (बस कोष्ठकों के बाहर की तरह)। इन आदेशों को एक अलग उपप्रकार में निष्पादित किया जाता है, इसलिए कोष्ठक के अंदर किए गए किसी भी पुनर्निर्देशन, असाइनमेंट आदि का कोष्ठकों के बाहर कोई प्रभाव नहीं पड़ता है।
    • एक प्रमुख डॉलर चिह्न के साथ, $(…)एक कमांड प्रतिस्थापन है : कोष्ठक के अंदर एक कमांड है, और कमांड से आउटपुट कमांड लाइन के हिस्से के रूप में उपयोग किया जाता है (अतिरिक्त विस्तार के बाद जब तक प्रतिस्थापन डबल कोट्स के बीच नहीं होता है, लेकिन यह एक और कहानी है ) ।
  • { … }ब्रेसिज़ कोष्ठक की तरह होते हैं, जिसमें वे समूह कमांड करते हैं, लेकिन वे केवल पार्सिंग को प्रभावित करते हैं, समूहन को नहीं। कार्यक्रम x=2; { x=4; }; echo $x4 प्रिंट करता है, जबकि x=2; (x=4); echo $xप्रिंट 2। (इसके अलावा ब्रेसिज़ होने वाले कीवर्ड्स को सीमांकित किया जाना चाहिए और कमान की स्थिति में पाया जाना चाहिए (इसलिए अंतरिक्ष के बाद {और ;पहले }) जबकि कोष्ठक नहीं है। यह सिर्फ एक सिंटैक्स क्वर्क है।)
    • एक प्रमुख डॉलर चिह्न के साथ, ${VAR}एक पैरामीटर विस्तार है , संभव अतिरिक्त परिवर्तनों के साथ एक चर के मूल्य का विस्तार। ksh93खोल भी समर्थन करता है, ${ cmd;}आदेश प्रतिस्थापन है कि एक subshell अंडे नहीं करता है के रूप के रूप में।
  • ((…))डबल कोष्ठक एक अंकगणितीय अनुदेश को घेरता है, जो पूर्णांक पर एक संगणना है, जो अन्य प्रोग्रामिंग भाषाओं से मिलता जुलता है। इस सिंटैक्स का उपयोग अधिकतर असाइनमेंट और सशर्त में किया जाता है। यह केवल ksh / bash / zsh में मौजूद है, सादे श में नहीं।
    • उसी सिंटैक्स का उपयोग अंकगणितीय अभिव्यक्तियों में किया जाता है $((…)), जो अभिव्यक्ति के पूर्णांक मान तक विस्तृत होता है।
  • [ … ]एकल कोष्ठक सशर्त अभिव्यक्तियों को घेरते हैं । सशर्त अभिव्यक्तियों को ज्यादातर संचालकों पर बनाया जाता -n "$variable"है जैसे परीक्षण करना कि क्या एक चर खाली है और -e "$file"यदि कोई फ़ाइल मौजूद है तो परीक्षण करें। ध्यान दें कि आपको प्रत्येक ऑपरेटर (जैसे [ "$x" = "$y" ], नहीं [ "$x"="$y" ]) के चारों ओर एक स्थान ;और ब्रैकेट्स (जैसे [ -n "$foo" ], नहीं [-n "$foo"]) के अंदर और बाहर एक स्थान या एक वर्ण की आवश्यकता है ।
  • [[ … ]]डबल ब्रैकेट ksh / bash / zsh में कुछ अतिरिक्त सुविधाओं के साथ सशर्त अभिव्यक्तियों का एक वैकल्पिक रूप है, उदाहरण के लिए आप यह [[ -L $file && -f $file ]]जांचने के लिए लिख सकते हैं कि क्या कोई फ़ाइल एक नियमित फ़ाइल का प्रतीकात्मक लिंक है जबकि एकल ब्रैकेट की आवश्यकता है [ -L "$file" ] && [ -f "$file" ]। देखें कि दोहरे कोष्ठक [[लेकिन एकल कोष्ठक नहीं] के बिना रिक्त स्थान के साथ पैरामीटर विस्तार क्यों होता है? इस विषय पर अधिक जानकारी के लिए।

शेल में, प्रत्येक कमांड एक सशर्त कमांड है: प्रत्येक कमांड में एक रिटर्न स्टेटस होता है जो 0 या तो सफलता का संकेत दे रहा है या 1 और 255 के बीच पूर्णांक (और कुछ गोले में संभवतः अधिक) विफलता का संकेत देता है। [ … ]आदेश (या [[ … ]]वाक्य रचना फार्म) एक विशेष आदेश जो यह भी स्पष्ट किया जा सकता है test …और सफल होता है जब एक फ़ाइल मौजूद है, या जब एक स्ट्रिंग गैर खाली है, या जब एक नंबर एक और से छोटा होता है, आदि ((…))वाक्य रचना प्रपत्र सफल होता है जब एक नंबर नॉनवेज है। यहाँ शेल स्क्रिप्ट में कुछ उदाहरण दिए गए हैं:

  • यदि myfileस्ट्रिंग में टेस्ट हो hello:

    if grep -q hello myfile; then 
  • यदि mydirएक निर्देशिका है, तो इसे बदलें और सामान करें:

    if cd mydir; then
      echo "Creating mydir/myfile"
      echo 'some content' >myfile
    else
      echo >&2 "Fatal error. This script requires mydir to exist."
    fi
    
  • myfileवर्तमान निर्देशिका में नामक एक फ़ाइल का परीक्षण करें :

    if [ -e myfile ]; then 
  • समान, लेकिन झूलने के प्रतीकात्मक लिंक भी शामिल हैं:

    if [ -e myfile ] || [ -L myfile ]; then 
  • यदि मान x(जो संख्यात्मक माना जाता है) का परीक्षण कम से कम 2, आंशिक रूप से किया जाता है:

    if [ "$x" -ge 2 ]; then 
  • यदि xबैश / ksh / zsh में, का मान (जो संख्यात्मक माना जाता है) कम से कम 2 है, तो परीक्षण करें:

    if ((x >= 2)); then 

ध्यान दें कि एकल ब्रैकेट -aइसके बजाय का समर्थन करता है &&, इसलिए कोई भी लिख सकता है: [ -L $file -a -f $file ]जो अतिरिक्त के बिना कोष्ठक के भीतर वर्णों की समान संख्या है [और ]...
एलेक्सिस विल्के

6
@AlexisWilke ऑपरेटर -aऔर -oसमस्याग्रस्त हैं क्योंकि वे गलत पार्स को जन्म दे सकते हैं यदि कुछ ऑपरेटर शामिल होते हैं जो ऑपरेटर की तरह दिखते हैं। इसलिए मैं उनका उल्लेख नहीं करता: उन्हें शून्य लाभ है और हमेशा काम नहीं करते। और एक अच्छे कारण के बिना कभी भी अछूता हुआ वैरिएबल एक्सपेंशन न लिखें: [[ -L $file -a -f $file ]]ठीक है लेकिन सिंगल ब्रैकेट के साथ आपकी ज़रूरत है [ -L "$file" -a -f "$file" ](जो कि ठीक है जैसे कि $fileहमेशा शुरू होता है /या ./)।
गाइल्स

ध्यान दें कि यह [[ -L $file && -f $file ]]( संस्करण के -aसाथ नहीं [[...]]) है।
स्टीफन चेज़लस

18

से बैश प्रलेखन :

(list)सूची को एक सबहेल्ड वातावरण में निष्पादित किया जाता है (नीचे COMMAND EXECUTION ENVIRONMENT देखें)। वैरिएबल असाइनमेंट और बिल्डइन कमांड जो शेल के वातावरण को प्रभावित करते हैं कमांड के पूरा होने के बाद प्रभाव में नहीं रहते हैं। वापसी की स्थिति सूची की निकास स्थिति है।

दूसरे शब्दों में, आप यह सुनिश्चित करें कि जो कुछ भी (एक तरह 'सूची' में होता है बनाने के cd) के बाहर कोई प्रभाव नहीं है (और )। केवल बात यह है कि रिसाव पिछले आदेश की या साथ बाहर निकलें कोड है set -eपहले आदेश है कि (एक तरह के रूप में कुछ अन्य की तुलना में एक त्रुटि उत्पन्न करता है if, whileआदि)

((expression))अभिव्यक्ति का मूल्यांकन ARITHMETIC EVALUATION के तहत नीचे वर्णित नियमों के अनुसार किया गया है। यदि अभिव्यक्ति का मूल्य गैर-शून्य है, तो वापसी की स्थिति 0 है; अन्यथा वापसी की स्थिति 1. यह "अभिव्यक्ति" को बताने के लिए बिल्कुल बराबर है।

यह एक बैश एक्सटेंशन है जिससे आप गणित कर सकते हैं। यह कुछ हद तक exprबिना सीमाओं के उपयोग के समान है expr(जैसे हर जगह रिक्त स्थान होना, बचना *, आदि)

[[ expression ]]सशर्त अभिव्यक्ति के मूल्यांकन के आधार पर 0 या 1 की स्थिति लौटाएं। अभिव्यक्तियाँ CONDITIONAL EXPRESSIONS के तहत नीचे वर्णित प्राइमरी से बनी हैं। वर्ड बंटवारे और pathname विस्तार [[और]] के बीच के शब्दों पर नहीं किया जाता है; टिल्ड विस्तार, पैरामीटर और चर विस्तार, अंकगणितीय विस्तार, कमांड प्रतिस्थापन, प्रक्रिया प्रतिस्थापन, और उद्धरण हटाने का प्रदर्शन किया जाता है। सशर्त ऑपरेटरों जैसे -f को प्राइमरी के रूप में मान्यता प्राप्त करने के लिए अयोग्य घोषित किया जाना चाहिए।

जब [[, <और> ऑपरेटर्स के साथ प्रयोग किया जाता है तो लेक्सिकोग्राफ़िक रूप से वर्तमान लोकेल का उपयोग करते हैं।

यह तार, संख्या और फ़ाइलों की तुलना करने के लिए एक उन्नत परीक्षण testप्रदान करता है, ऑफ़र की तरह थोड़ा सा , लेकिन अधिक शक्तिशाली।

[ expr ]सशर्त अभिव्यक्ति expr के मूल्यांकन के आधार पर 0 (सच्चा) या 1 (झूठा) की स्थिति लौटाएं। प्रत्येक ऑपरेटर और संचालन और एक अलग तर्क होना चाहिए। अभिव्यक्तियाँ CONDITIONAL EXPRESSIONS के तहत ऊपर वर्णित प्राइमरी से बनी हैं। परीक्षण किसी भी विकल्प को स्वीकार नहीं करता है, और न ही यह स्वीकार करता है और एक तर्क को अनदेखा करता है - जैसा कि विकल्पों के अंत को दर्शाता है।

[...]

यह एक पुकार है test। दरअसल, पुराने दिनों में, [एक प्रतीकात्मक कड़ी थी test। यह उसी तरह काम करता है और आपकी सीमाएं समान हैं। चूंकि एक बाइनरी उस नाम को जानता है जिसके साथ इसे शुरू किया गया था, परीक्षण कार्यक्रम मापदंडों को पार्स कर सकता है जब तक कि यह एक पैरामीटर नहीं पाता ]। मज़ा यूनिक्स चाल।

ध्यान दें कि के मामले में bash, [और testअंतर्निहित कार्य हैं (जैसा कि एक टिप्पणी में उल्लेख किया गया है), फिर भी बहुत अधिक समान सीमाएं लागू होती हैं।


1
हालांकि testऔर [निश्चित रूप से बाश में निर्मित कमांड हैं, लेकिन यह संभावना है कि एक बाहरी बाइनरी भी मौजूद है।
ilkachachu

1
बाहरी बाइनरी अधिकांश आधुनिक प्रणालियों पर [एक प्रतीकात्मक लिंक नहीं है test
रैंडम 832

1
किसी तरह, मुझे यह मनोरंजक लगता है कि वे दो अलग-अलग बायनेरिज़ बनाने के लिए परेशान करते हैं, जो दोनों के पास बस वही हैं जिनकी उन्हें ज़रूरत है, बजाय केवल उन्हें मिलाए और कुछ शर्तों के जोड़े। हालांकि वास्तव में strings /usr/bin/testपता चलता है कि इसमें मदद पाठ भी है, इसलिए मुझे नहीं पता कि क्या कहना है।
ilkachachu

2
@ Random832 मुझे अप्रत्याशित arg0 व्यवहार से बचने के लिए GNU तर्क के बारे में अपनी बात मिलती है लेकिन POSIX आवश्यकताओं के बारे में, मैं इतना सकारात्मक नहीं होता। हालांकि testमानक के अनुसार कमांड को एक स्टैंडअलोन फ़ाइल आधारित कमांड के रूप में मौजूद होना आवश्यक है, लेकिन इसमें कुछ भी नहीं बताया गया है कि इसके [संस्करण को भी इस तरह से लागू करने की आवश्यकता है। उदाहरण के लिए, सोलारिस 11 कोई [निष्पादन योग्य प्रदान नहीं करता है, लेकिन फिर भी पोसिक्स मानकों के साथ पूरी तरह से अनुरूप है
jlliagre

2
(बाहर निकलें 1) कोष्ठकों के बाहर एक प्रभाव है।
अलेक्जेंडर

14

[ बनाम [[

यह उत्तर प्रश्न के [बनाम [[सबसेट को कवर करेगा ।

बैश 4.3.11 पर कुछ अंतर:

  • POSIX बनाम बैश एक्सटेंशन:

  • मैजिक बनाम रेगुलर कमांड

    • [ एक अजीब नाम के साथ सिर्फ एक नियमित आदेश है।

      ]सिर्फ एक तर्क है [जो आगे के तर्कों का उपयोग करने से रोकता है।

      Ubuntu 16.04 वास्तव में इसके लिए एक निष्पादन योग्य है जो /usr/bin/[कोरुटिल्स द्वारा प्रदान किया गया है, लेकिन बैश बिल्ट-इन संस्करण पूर्वता लेता है।

      बैश कमांड को पार्स करने के तरीके में कोई बदलाव नहीं किया गया है।

      विशेष रूप से, <पुनर्निर्देशन होता है, &&और ||कई आदेशों को समाप्‍त ( )करता है \, जब तक कि बच नहीं जाता , तब तक उप-जनरेट करता है , और शब्‍द विस्‍तार सामान्य रूप से होता है।

    • [[ X ]]एक एकल निर्माण है जिसे Xजादुई रूप से पार्स किया जाता है। <, और &&, विशेष रूप से व्यवहार किया जाता है, और शब्द विभाजन नियम अलग हैं।||()

      आगे =और भी अंतर हैं जैसे और =~

      Bashese में: [एक अंतर्निहित कमांड है, और [[एक कीवर्ड है: https://askubuntu.com/questions/445749/whats-the-difference-between-shell-builtin-and-shell-bword

  • <

  • && तथा ||

    • [[ a = a && b = b ]]: सत्य, तार्किक और
    • [ a = a && b = b ]: सिंटैक्स त्रुटि, &&और कमांड विभाजक के रूप में पार्सcmd1 && cmd2
    • [ a = a -a b = b ]: समकक्ष, लेकिन POSIX, द्वारा पदावनत
    • [ a = a ] && [ b = b ]: POSIX और विश्वसनीय समकक्ष
  • (

    • [[ (a = a || a = b) && a = b ]]: असत्य
    • [ ( a = a ) ]: वाक्यविन्यास त्रुटि, ()एक उपधारा के रूप में व्याख्या की जाती है
    • [ \( a = a -o a = b \) -a a = b ]: समतुल्य, लेकिन ()पोसिक्स द्वारा पदावनत किया जाता है
    • { [ a = a ] || [ a = b ]; } && [ a = b ]POSIX बराबर 5
  • विस्तार और विभाजन (ग्लोब + ग्लोब) पर शब्द विभाजन और फ़ाइल नाम

    • x='a b'; [[ $x = 'a b' ]]: सच है, उद्धरण की जरूरत नहीं है
    • x='a b'; [ $x = 'a b' ]: सिंटैक्स त्रुटि, के लिए फैलता है [ a b = 'a b' ]
    • x='*'; [ $x = 'a b' ]: सिंटैक्स त्रुटि यदि वर्तमान निर्देशिका में एक से अधिक फ़ाइल है।
    • x='a b'; [ "$x" = 'a b' ]: POSIX बराबर
  • =

    • [[ ab = a? ]]: सच है, क्योंकि यह पैटर्न मिलान ( * ? [जादू है) करता है। मौजूदा निर्देशिका में फ़ाइलों के लिए ग्लोब का विस्तार नहीं करता है।
    • [ ab = a? ]: a?ग्लोब फैलता है। तो वर्तमान निर्देशिका में फ़ाइलों के आधार पर सही या गलत हो सकता है।
    • [ ab = a\? ]: असत्य, ग्लोब विस्तार नहीं
    • =और ==दोनों में ही कर रहे हैं [और [[, लेकिन ==एक बैश विस्तार है।
    • case ab in (a?) echo match; esac: POSIX बराबर
    • [[ ab =~ 'ab?' ]]: झूठी 4 , के साथ जादू खो देता है''
    • [[ ab? =~ 'ab?' ]]: सच
  • =~

    • [[ ab =~ ab? ]]: सच है, POSIX ने नियमित अभिव्यक्ति मैच बढ़ाया , ?ग्लोब का विस्तार नहीं हुआ
    • [ a =~ a ]: वक्य रचना त्रुटि। कोई बैश के बराबर नहीं।
    • printf 'ab\n' | grep -Eq 'ab?': POSIX समतुल्य (केवल एकल पंक्ति डेटा)
    • awk 'BEGIN{exit !(ARGV[1] ~ ARGV[2])}' ab 'ab?': POSIX बराबर।

सिफ़ारिश : हमेशा उपयोग []

[[ ]]मेरे द्वारा देखे गए प्रत्येक निर्माण के लिए POSIX समकक्ष हैं ।

यदि आप का उपयोग करें [[ ]]:

  • पोर्टेबिलिटी खो देते हैं
  • पाठक को किसी अन्य बैश एक्सटेंशन की पेचीदगियों को सीखने के लिए मजबूर करें। [एक अजीब नाम के साथ सिर्फ एक नियमित आदेश है, कोई विशेष शब्दार्थ शामिल नहीं है।

¹ [[...]]कोर्न शेल में समतुल्य निर्माण से प्रेरित

² लेकिन के कुछ मूल्यों के लिए विफल रहता है aया b(जैसे +या index) और संख्यात्मक तुलना करता है, तो करता है aऔर bदशमलव पूर्णांकों की तरह लग रहे। expr "x$a" '<' "x$b"दोनों के आसपास काम करता है।

³ और यह भी के कुछ मूल्यों के लिए विफल रहता है aया bकी तरह !या (

4 बैश 3.2 और उससे अधिक में और बैश 3.1 के लिए अनुकूलता प्रदान की गई (सक्षम नहीं है BASH_COMPAT=3.1)

5 हालांकि समूहबद्धता (यहां {...;}कमांड समूह (...)जिसके साथ एक अनावश्यक उपधारा चलेंगे) आवश्यक नहीं है क्योंकि शेल ऑपरेटर ||और &&( ऑपरेटर ||और / ऑपरेटर के विपरीत ) समान पूर्वता रखते हैं। तो समकक्ष होगा।&& [[...]]-o-a [[ a = a ] || [ a = b ] && [ a = b ]


@ स्टीफनचैजेलस जानकारी के लिए धन्यवाद! मैंने exprउत्तर में जोड़ा है। शब्द "बैश एक्सटेंशन" का अर्थ यह नहीं है कि बैश कुछ वाक्यविन्यास को जोड़ने के लिए पहला खोल था, पोसिक्स श बनाम बश सीखने से पहले ही मुझे पागल करने के लिए पर्याप्त है।
सिरो सेंटिल्ली 新疆 改造 iro 六四 事件

देखें man testकि क्या आपने कोशिश की man [और हार गए। यह POSIX संस्करण की व्याख्या करेगा।
जोनाथन कोमर

13

कुछ उदाहरण:

पारंपरिक परीक्षण:

foo="some thing"
# check if value of foo is not empty
if [ -n "$foo" ] ; then... 
if test -n "$foo" ; then... 

testऔर [किसी भी अन्य की तरह आदेश हैं, इसलिए चर को शब्दों में विभाजित किया जाता है जब तक कि यह उद्धरण में न हो।

नई शैली की परीक्षा

[[ ... ]] एक (नया) विशेष शेल निर्माण है, जो थोड़ा अलग तरीके से काम करता है, सबसे स्पष्ट बात यह है कि यह शब्द-विभाजन चर नहीं करता है:

if [[ -n $foo ]] ; then... 

कुछ पर प्रलेखन [और [[यहाँ

अंकगणित परीक्षण:

foo=12 bar=3
if (( $foo + $bar == 15 )) ; then ...  

"सामान्य" आदेश:

उपरोक्त सभी सामान्य आदेशों की तरह काम करते हैं, और ifकोई भी आदेश ले सकते हैं:

# grep returns true if it finds something
if grep pattern file ; then ...

एकाधिक आदेश:

या हम कई कमांड का उपयोग कर सकते हैं। कमांड के एक सेट को लपेटकर ( ... )उन्हें उप-क्रम में चलाता है, शेल की स्थिति (कार्यशील निर्देशिका, चर) की एक अस्थायी प्रतिलिपि बनाता है । यदि हमें किसी प्रोग्राम को अस्थायी रूप से किसी अन्य निर्देशिका में चलाने की आवश्यकता है:

# this will move to $somedir only for the duration of the subshell 
if ( cd $somedir ; some_test ) ; then ...

# while here, the rest of the script will see the new working
# directory, even after the test
if cd $somedir ; some_test ; then ...

1

ग्रुपिंग कमांड्स

बैश एक इकाई के रूप में निष्पादित होने वाली आदेशों की सूची को समूहित करने के दो तरीके प्रदान करता है।

( list )कोष्ठक के बीच आदेशों की एक सूची रखने से एक उप-वातावरण का निर्माण होता है, और सूची के प्रत्येक आदेशों को उस उपधारा में निष्पादित किया जाता है। चूंकि सूची को एक सबशेल में निष्पादित किया जाता है, इसलिए सबहेल पूरा होने के बाद चर असाइनमेंट प्रभाव में नहीं रहते हैं।

$ a=1; (a=2; echo "inside: a=$a"); echo "outside: a=$a"
inside: a=2
outside: a=1

{ list; }घुंघराले ब्रेसिज़ के बीच आदेशों की एक सूची रखने से सूची को वर्तमान शेल संदर्भ में निष्पादित किया जा सकता है । कोई सबस्क्रिप्शन नहीं बनाया जाता है। सूची के बाद अर्धविराम (या नई पंक्ति) की आवश्यकता है। स्रोत

${} Parameter expansion Ex:  ANIMAL=duck; echo One $ANIMAL, two ${ANIMAL}s
$() Command substitution Ex: result=$(COMMAND) 
$(()) Arithmetic expansion Ex: var=$(( 20 + 5 )) 

सशर्त निर्माण

एकल ब्रैकेट यानी []
तुलना के लिए ==, !=, <,और >इसका इस्तेमाल किया जाना चाहिए और संख्यात्मक तुलना के लिए eq, ne,ltऔर gtइसका इस्तेमाल किया जाना चाहिए।

संवर्धित ब्रैकेट यानी[[]]

उपरोक्त सभी उदाहरणों में, हमने सशर्त अभिव्यक्ति को संलग्न करने के लिए केवल एकल ब्रैकेट का उपयोग किया था, लेकिन बैश डबल ब्रैकेट की अनुमति देता है जो सिंगल-ब्रैकेट सिंटैक्स के वर्धित संस्करण के रूप में कार्य करता है।

तुलना के लिए ==, !=, <,और >शाब्दिक उपयोग कर सकते हैं।

  • [टेस्ट कमांड का एक पर्याय है। भले ही इसे शेल में बनाया गया हो, यह एक नई प्रक्रिया बनाता है।
  • [[ इसका एक नया उन्नत संस्करण है, जो एक कीवर्ड है, एक कार्यक्रम नहीं है।
  • [[द्वारा समझा जाता है Kornऔर Bash

स्रोत

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