2013-09-29 6 views
13

क्या ब्रश स्क्रिप्टिंग में उपयोग के लिए सभी if स्विच की एक सूची है? कभी-कभी मैं इसका उपयोग कर किसी को देखता हूं और मुझे आश्चर्य है कि वे वास्तव में किस स्विच का उपयोग कर रहे हैं।'if' की सूची कहीं भी स्विच करती है?

उदाहरण इस में -z है। मुझे पता है कि इसका उपयोग कैसे करें, लेकिन मुझे नहीं पता कि यह कहां से लिया गया था।

if [ -z "$BASH_VERSION" ]; then 
    echo -e "Error: this script requires the BASH shell!" 
    exit 1 
fi 

कोई संदर्भ, गाइड, पोस्ट, उत्तर की सराहना की जाएगी।

+0

http://www.gnu.org/software/bash/manual/bashref.html –

+0

'' '' test' कमांड के लिए एक छोटा नाम है। 'मैन टेस्ट' आज़माएं। – Barmar

+0

@ बाड़मेर का मतलब है 'सहायता परीक्षण'। 'मैन टेस्ट' '/ bin/test' के लिए प्रलेखन है, और यह' test' बिल्टिन – SheetJS

उत्तर

18

बैश मैनपेज (man bash) पर देखें। विकल्प CONDITIONAL EXPRESSIONS खंड में निर्दिष्ट कर रहे हैं:

CONDITIONAL EXPRESSIONS 
     Conditional expressions are used by the [[ compound command and the 
     test and [ builtin commands to test file attributes and perform string 
     and arithmetic comparisons. Expressions are formed from the following 
     unary or binary primaries. If any file argument to one of the pri- 
     maries is of the form /dev/fd/n, then file descriptor n is checked. If 
     the file argument to one of the primaries is one of /dev/stdin, 
     /dev/stdout, or /dev/stderr, file descriptor 0, 1, or 2, respectively, 
     is checked. 

     Unless otherwise specified, primaries that operate on files follow sym- 
     bolic links and operate on the target of the link, rather than the link 
     itself. 

     -a file 
       True if file exists. 
     ... more options ... 

यह भी मदद से समझाया गया है:

$ help [ [: [ arg... ] 
    This is a synonym for the "test" builtin, but the last 
    argument must be a literal `]', to match the opening `['. 
+6

ऑनलाइन मैन्युअल: [बैश सशर्त अभिव्यक्तियां] (http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions।एचटीएमएल) –

2

यह वास्तव में if नहीं है जो यह प्रदान कर रहा है - यह [ है, जिसे test के नाम से जाना जाता है। help test आपको उन सभी विकल्पों की एक सूची देनी चाहिए जो इसे ले सकते हैं। यदि आप परवाह करते हैं तो आप the standard पर भी देख सकते हैं।

+1

-1: परीक्षण दोनों आदेश '/ bin/test' और एक बैश बिल्टिन है। 'मैन टेस्ट' आपको कमांड के लिए डॉक्टर देता है, लेकिन '[' अंतर्निहित के लिए समानार्थी है। अलग व्यवहार के उदाहरण के रूप में, ओएसएक्स पर बैश बिल्टिन '-N' परीक्षण का समर्थन करता है लेकिन '/ bin/test' – SheetJS

3

वे if बयान के लिए स्विच नहीं हैं, लेकिन test आदेश के लिए ([test builtin के लिए एक पर्याय है)। पूरी सूची के लिए help test बैश में देखें।

4

हां। ये conditional expressions कहा जाता है और इन [[compound command और test और [builtin commands द्वारा किया जाता है ([ बस test के लिए एक पर्याय है)।

Bash Reference Manual के अनुभाग 6.4 Bash Conditional Expressions पढ़ें, जिसमें इन सभी स्विच और उनके उपयोग की एक सूची शामिल है।

+0

एकल पृष्ठ नहीं है: [6.4 बैश सशर्त अभिव्यक्तियां] (http://www.gnu.org/ सॉफ़्टवेयर/बैश/मैनुअल/html_node/Bash-Conditional-Expressions.html) –

2

एकल वर्ग कोष्ठक ([ ... ]) test आदेश का एक पर्याय है। यदि आप manpage for test देखते हैं, तो आप स्विच करते समय लगभग सभी (BASH में कुछ अतिरिक्त उल्लेख नहीं किए गए हैं) यदि आप उन्हें स्विच करते हैं तो उन्हें देखेंगे। सब एक खोजने के लिए आसान जगह में।

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

यदि आप स्विच करते हैं तो आप उन्हें कहते हैं, लेकिन यह वास्तव में सही नहीं है। ये परीक्षण हैं और वास्तव में if कमांड से कोई लेना देना नहीं है।

if आदेश केवल आदेश आप इसे कार्यान्वित करता है, और उसके बाद ही उस आदेश 0 की एक निकास कोड देता है, if बयान के if भाग चलेंगे। अन्यथा, यह else भाग (यदि वह मौजूद है) चलाएगा।इस पर

आइए नज़र:

$ rm foo.test.txt # Hope this wasn't an important file 
$ if ls foo.test.txt 
> then 
> echo "This file exists" 
> else 
> echo "I can't find it anywhere.." 
> fi 
ls: foo.test.txt: No such file or directory 
I can't find it anywhere.. 

if बयान ls foo.test.txt आदेश चलाता है और ls आदेश एक गैर शून्य रिटर्न क्योंकि फ़ाइल मौजूद नहीं है। यह else खंड निष्पादित करने के लिए if कथन का कारण बनता है।

$ touch foo.test.txt # Now this file exists. 
$ if ls foo.test.txt # Same "if/else" statement as above 
> then 
> echo "This file exists" 
> else 
> echo "I can't find it anywhere.." 
> fi 
foo.test.txt 
This file exists 

यहाँ, ls आदेश एक 0 बाहर निकलें स्थिति लौटा (के बाद से फ़ाइल मौजूद है और फ़ाइल मौजूद है और ls आदेश से stat'ed किया जा सकता है कि फिर से कोशिश करते हैं ...।

आम तौर पर, आपको फ़ाइल के परीक्षण के लिए ls कमांड का उपयोग नहीं करना चाहिए। मैंने इसे केवल यह दिखाने के लिए उपयोग किया है कि if कथन आदेश निष्पादित करता है, फिर उस आदेश की निकास स्थिति के आधार पर if या else खंड निष्पादित किया गया। आप परीक्षण करने के लिए किया जाए या नहीं एक फ़ाइल मौजूद चाहते हैं, आप ls आदेश के बजाय test -e आदेश का उपयोग करना चाहिए: फ़ाइल मौजूद

if test -e foo.test.txt # Same as above, but using "test" instead of "ls" 
then 
    echo "This file exists" 
else 
    echo "I can't find it anywhere.." 
fi 

हैं, तो test -e0 की एक निकास स्थिति वापस आ जाएगी। अन्यथा, यह एक गैर-शून्य निकास स्थिति वापस कर देगा।

आप ऐसा करते हैं: 10958inode है

$ ls -i /bin/test /bin/[ 
10958 /bin/[ 10958 /bin/test 

है। उसी इनोड के साथ फ़ाइलें एक ही फ़ाइल के लिए दो अलग-अलग नाम हैं। इस प्रकार [ और test कमांड नरम जुड़े हुए हैं । इसका मतलब है आप test के बजाय [ उपयोग कर सकते हैं:

if [ -e foo.test.txt ] 
then 
    echo "This file exists" 
else 
    echo "I can't find it anywhere.." 
fi 

परिचित लग रहा है?


1. मार में, test और [ builtin कर रहे हैं, इसलिए जब आप मार में इन आदेशों को चलाने के लिए, यह /bin/test या /bin/[ नहीं चल रहा है। हालांकि, वे अभी भी एक दूसरे से जुड़े हुए हैं।

+0

'[' परीक्षण का उपनाम नहीं है। समानार्थी शब्द मैनपेज शब्द है। उपनाम का एक विशिष्ट अर्थ है (बैश मैनपेज में, अनुभाग 'ALIASES'' पढ़ें – SheetJS

+0

ठीक है। मैं इसे बदल दूंगा। मैं बस एक ऐसे शब्द की तलाश में था जो समझाएगा कि दोनों कैसे जुड़े हुए हैं। –

संबंधित मुद्दे