खोज…


वाक्य - विन्यास

  • ["$ 1" = "$ 2"] #A "[" ब्रैकेट वास्तव में एक कमांड है। इस वजह से इसके लिए और उसके बाद एक जगह की आवश्यकता होती है।
  • परीक्षण "$ 1" = "$ 2" # टेस्ट "[" कमांड का एक पर्याय है

पैरामीटर

पैरामीटर [या परीक्षण करने के लिए विवरण
फ़ाइल संचालक विवरण
-e "$file" यदि फ़ाइल मौजूद है तो सही है।
-d "$file" फ़ाइल मौजूद है और एक निर्देशिका है, तो सही है
-f "$file" यदि फ़ाइल मौजूद है और एक नियमित फ़ाइल है तो यह सही है
-h "$file" यदि फ़ाइल मौजूद है और यह एक प्रतीकात्मक लिंक है, तो सही है
स्ट्रिंग कंप्रेशर्स विवरण
-z "$str" सच है अगर स्ट्रिंग की लंबाई शून्य है
-n "$str सच है अगर स्ट्रिंग की लंबाई गैर-शून्य है
"$str" = "$str2" यह सच है कि अगर स्ट्रिंग $ str स्ट्रिंग $ str2 के बराबर है। पूर्णांक के लिए सबसे अच्छा नहीं है। यह काम कर सकता है लेकिन असंगत होगा
"$str" != "$str2" सच है अगर तार बराबर नहीं हैं
पूर्णांक तुलना विवरण
"$int1" -eq "$int2" पूर्णांक बराबर हैं, तो सही है
"$int1" -ne "$int2" सही है अगर पूर्णांक बराबर नहीं हैं
"$int1" -gt "$int2" सच है अगर int1 int 2 से अधिक है
"$int1" -ge "$int2" सच है अगर int1 int2 से अधिक या बराबर है
"$int1" -lt "$int2" सच है अगर int1 int 2 से कम है
"$int1" -le "$int2" सच है अगर int1 int2 से कम या बराबर है

टिप्पणियों

बैश में कई तुलनित्र पैरामीटर उपलब्ध हैं। सभी अभी तक यहां सूचीबद्ध नहीं हैं।

अगर बयान

if [[ $1 -eq 1 ]]; then
    echo "1 was passed in the first parameter"
elif [[ $1 -gt 2 ]]; then
    echo "2 was not passed in the first parameter"
else
    echo "The first parameter was not 1 and is not more than 2."
fi

समापन fi आवश्यक है, लेकिन elif और / या else खंड छोड़ा जा सकता है।

then से पहले अर्धविराम एक पंक्ति में दो आदेशों के संयोजन के लिए मानक वाक्यविन्यास हैं; उन्हें केवल तभी छोड़ा जा सकता है जब then अगली पंक्ति में ले जाया जाए।

यह समझना महत्वपूर्ण है कि कोष्ठक [[ वाक्य रचना का हिस्सा नहीं हैं, लेकिन एक कमांड के रूप में माना जाता है; यह इस आदेश से बाहर निकलने का कोड है जिसका परीक्षण किया जा रहा है। इसलिए, आपको हमेशा कोष्ठक के चारों ओर रिक्त स्थान शामिल करना चाहिए।

इसका मतलब यह भी है कि किसी भी आदेश के परिणाम का परीक्षण किया जा सकता है। यदि कमांड से निकास कोड शून्य है, तो कथन को सत्य माना जाता है।

if grep "foo" bar.txt; then
    echo "foo was found"
else
    echo "foo was not found"
fi

गणितीय अभिव्यक्तियाँ, जब डबल कोष्ठक के अंदर रखी जाती हैं, उसी तरह 0 या 1 भी लौटाती हैं, और इसका परीक्षण भी किया जा सकता है:

if (( $1 + 5 > 91 )); then
    echo "$1 is greater than 86"
fi

if एकल कोष्ठक के साथ कथन हैं, if आप भर में भी आ सकते हैं। ये POSIX मानक में परिभाषित किए गए हैं और Bash सहित सभी POSIX- संगत गोले में काम करने की गारंटी है। वाक्य रचना बाश में बहुत समान है:

if [ "$1" -eq 1 ]; then
    echo "1 was passed in the first parameter"
elif [ "$1" -gt 2 ]; then
    echo "2 was not passed in the first parameter"
else
    echo "The first parameter was not 1 and is not more than 2."
fi

घुमाव के दौरान

#! /bin/bash

i=0

while [ $i -lt 5 ] #While i is less than 5
do
    echo "i is currently $i"
    i=$[$i+1] #Not the lack of spaces around the brackets. This makes it a not a test expression
done #ends the loop

देखें कि परीक्षण के दौरान कोष्ठक के चारों ओर रिक्त स्थान हैं (बाद के बयान के बाद)। ये रिक्त स्थान आवश्यक हैं।

यह लूप आउटपुट:

i is currently 0
i is currently 1
i is currently 2
i is currently 3
i is currently 4

पाश के लिए

#! /bin/bash

for i in 1 "test" 3; do #Each space separated statement is assigned to i
    echo $i
done

अन्य कमांड लूप ओवर पर स्टेटमेंट जेनरेट कर सकते हैं। "संख्याओं में फेरबदल के लिए लूप का उपयोग करना" उदाहरण देखें।

यह आउटपुट:

1
test
3

संख्याओं की सूची को अलग करने के लिए लूप का उपयोग करना

#! /bin/bash

for i in {1..10}; do # {1..10} expands to "1 2 3 4 5 6 7 8 9 10"
    echo $i
done

यह निम्न आउटपुट देता है:

1
2
3
4
5
6
7
8
8
10

सी-स्टाइल सिंटैक्स के साथ लूप के लिए

लूप के for C- शैली का मूल प्रारूप है:

for (( variable assignment; condition; iteration process ))

टिप्पणियाँ:

  • लूप के for सी-स्टाइल के अंदर चर के असाइनमेंट में सामान्य असाइनमेंट के विपरीत रिक्त स्थान हो सकते हैं
  • लूप के for C- स्टाइल के अंदर चर $ पहले नहीं हैं।

उदाहरण:

for (( i = 0; i < 10; i++ ))
do
    echo "The iteration number is $i"
done

इसके अलावा हम सी-शैली के अंदर कई चर पर कार्रवाई कर सकते हैं for पाश:

for (( i = 0, j = 0; i < 10; i++, j = i * i ))
do
    echo "The square of $i is equal to $j"
done

लूप तक

जब तक स्थिति सही नहीं होती तब तक लूप निष्पादित होता है

i=5
until [[ i -eq 10 ]]; do #Checks if i=10
    echo "i=$i" #Print the value of i
    i=$((i+1)) #Increment i by 1
done

आउटपुट:

i=5
i=6
i=7
i=8
i=9

जब i लूप के सही होने तक 10 की स्थिति में पहुंच जाता i और लूप समाप्त हो जाता है।

जारी रखें और तोड़ें

जारी रखने के लिए उदाहरण

for i in [series]
do
    command 1
    command 2
    if (condition) # Condition to jump over command 3
            continue # skip to the next value in "series"
    fi
    command 3
done

ब्रेक के लिए उदाहरण

for i in [series]
do
    command 4
    if (condition) # Condition to break the loop
    then
            command 5 # Command if the loop needs to be broken
            break
    fi
    command 6 # Command to run if the "condition" is never true 
done

एक सरणी पर लूपिंग

for पाश:

arr=(a b c d e f)
for i in "${arr[@]}";do
    echo "$i"
done

या

for ((i=0;i<${#arr[@]};i++));do
    echo "${arr[$i]}" 
done

while लूप:

i=0
while [ $i -lt ${#arr[@]} ];do
    echo "${arr[$i]}"
    i=$(expr $i + 1)
done

या

i=0
while (( $i < ${#arr[@]} ));do
    echo "${arr[$i]}"
    ((i++))
done

लूप ब्रेक

कई लूप तोड़ें:

arr=(a b c d e f)
for i in "${arr[@]}";do
    echo "$i"
    for j in "${arr[@]}";do
        echo "$j"
        break 2
    done
done

आउटपुट:

a
a

सिंगल लूप तोड़ें:

arr=(a b c d e f)
for i in "${arr[@]}";do
    echo "$i"
    for j in "${arr[@]}";do
        echo "$j"
        break
    done
done

आउटपुट:

a
a
b
a
c
a
d
a
e
a
f
a

केस के साथ स्विच स्टेटमेंट

case स्टेटमेंट के साथ आप एक वैरिएबल के विरुद्ध मानों का मिलान कर सकते हैं।

case में दिए गए तर्क का विस्तार किया गया है और प्रत्येक पैटर्न के खिलाफ मिलान करने का प्रयास किया गया है।

यदि कोई मिलान पाया जाता है, तो आदेश तक ;; निष्पादित कर रहे हैं।

case "$BASH_VERSION" in
 [34]*)
    echo {1..4}
    ;;  
  *)
    seq -s" " 1 4
esac

पैटर्न नियमित अभिव्यक्ति नहीं हैं लेकिन शेल पैटर्न मिलान (उर्फ ग्लब्स) हैं।

सूची-के-शब्द पैरामीटर के बिना लूप के लिए

for arg; do
    echo arg=$arg
done

शब्दों की एक सूची के बिना लूप के for पैरामीटर इसके बजाय स्थितीय मापदंडों पर पुनरावृत्ति करेगा। दूसरे शब्दों में, उपरोक्त उदाहरण इस कोड के बराबर है:

for arg in "$@"; do
    echo arg=$arg
done

दूसरे शब्दों में, यदि आप for i in "$@"; do ...; done खुद को लिखने के for i in "$@"; do ...; done पकड़ते हैं for i in "$@"; do ...; done , बस भाग in छोड़, और for i; do ...; done बस के for i; do ...; done लिख for i; do ...; done

कमांड सूचियों का सशर्त निष्पादन

कमांड सूचियों के सशर्त निष्पादन का उपयोग कैसे करें

किसी भी अंतर्निहित कमांड, अभिव्यक्ति, या फ़ंक्शन, साथ ही किसी भी बाहरी कमांड या स्क्रिप्ट को सशर्त रूप से && (और) का उपयोग करके निष्पादित किया जा सकता है || (या) ऑपरेटर।

उदाहरण के लिए, यह केवल वर्तमान निर्देशिका को प्रिंट करेगा यदि cd कमांड सफल था।

cd my_directory && pwd

इसी तरह, अगर cd कमांड विफल हो जाती है तो यह बाहर निकल जाएगा, तबाही को रोक सकता है:

cd my_directory || exit
rm -rf *

इस तरह से कई बयानों को जोड़ते समय, यह याद रखना महत्वपूर्ण है कि (कई सी-शैली भाषाओं के विपरीत) इन ऑपरेटरों की कोई पूर्वता नहीं है और बाएं-सहयोगी हैं

इस प्रकार, यह कथन उम्मीद के मुताबिक काम करेगा ...

cd my_directory && pwd || echo "No such directory"
  • यदि cd सफल होता है, तो && pwd निष्पादित होता है और वर्तमान कार्यशील निर्देशिका नाम मुद्रित होता है। जब तक pwd विफल (एक दुर्लभ) || echo ... निष्पादित नहीं किया जाएगा।
  • अगर cd विफल होता है, && pwd को छोड़ दिया जाएगा और || echo ... चलेगी।

लेकिन यह नहीं होगा (यदि आप सोच रहे हैं if...then...else ) ...

cd my_directory && ls || echo "No such directory"
  • अगर cd विफल हो जाता है, && ls छोड़ दिया जाता है और || echo ... निष्पादित किया जाता है।
  • यदि cd सफल होता है, तो && ls निष्पादित किया जाता है।
    • यदि ls सफल होता है, || echo ... को नजरअंदाज किया जाता है। (अब तक तो सब ठीक है)
    • लेकिन ... अगर ls विफल रहता है, || echo ... भी निष्पादित किया जाएगा।

      यह ls , cd नहीं, यह पिछले कमांड है

कमांड सूचियों के सशर्त निष्पादन का उपयोग क्यों करें

सशर्त निष्पादन एक बाल की तुलना में तेजी से होता है if...then लेकिन इसका मुख्य लाभ फ़ंक्शंस और स्क्रिप्ट को जल्दी या "शॉर्ट सर्किट" से बाहर निकलने की अनुमति देता है।

C जैसी कई भाषाओं के विपरीत, जहाँ मेमोरी को स्पष्ट रूप से स्ट्रक्चर्स और वैरिएबल्स के लिए आवंटित किया जाता है और इस तरह (और इस तरह डीलॉक्लेट किया जाना चाहिए), bash कवर के तहत इसे हैंडल करता है। ज्यादातर मामलों में, हमें फंक्शन छोड़ने से पहले कुछ भी साफ नहीं करना पड़ता है। स्टैक पर रिटर्न एड्रेस पर एक return स्टेटमेंट फंक्शन के लिए लोकल और पिकअप एक्जीक्यूशन के बारे में सब कुछ बताएगा।

फ़ंक्शंस से लौटना या जितनी जल्दी हो सके स्क्रिप्ट से बाहर निकलना, इस प्रकार कोड के अनावश्यक निष्पादन से बचने के द्वारा प्रदर्शन में काफी सुधार कर सकता है और सिस्टम लोड को कम कर सकता है। उदाहरण के लिए...

my_function () {

    ### ALWAYS CHECK THE RETURN CODE

    # one argument required. "" evaluates to false(1)
    [[ "$1" ]]             || return 1

    # work with the argument. exit on failure
    do_something_with "$1" || return 1
    do_something_else      || return 1

    # Success! no failures detected, or we wouldn't be here
    return 0
}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow