खोज…


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

  • function कीवर्ड के साथ एक फ़ंक्शन को परिभाषित करें:

    function f {
    

    }

  • () साथ एक फ़ंक्शन को परिभाषित करें:

    f(){
    

    }

  • function कीवर्ड और () दोनों के साथ एक फ़ंक्शन को परिभाषित करें:

    function f(){
    

    }

सरल कार्य

helloWorld.sh

#!/bin/bash

# Define a function greet
greet ()
{
    echo "Hello World!"
}

# Call the function greet
greet

स्क्रिप्ट चलाने में, हम अपना संदेश देखते हैं

$ bash helloWorld.sh
Hello World!

ध्यान दें कि फ़ंक्शंस के साथ फ़ाइल सोर्स करना उन्हें आपके वर्तमान बैश सत्र में उपलब्ध कराता है।

$ source helloWorld.sh   # or, more portably, ". helloWorld.sh"
$ greet
Hello World!

आप कुछ गोले में एक फ़ंक्शन export कर सकते हैं, ताकि यह बाल प्रक्रियाओं के संपर्क में हो।

bash -c 'greet'  # fails
export -f greet  # export function; note -f
bash -c 'greet'  # success

तर्कों के साथ कार्य

helloJohn.sh :

#!/bin/bash

greet() {
  local name="$1"
  echo "Hello, $name"
}

greet "John Doe"
# running above script
$ bash helloJohn.sh
Hello, John Doe
  1. यदि आप किसी भी तरह से तर्क को संशोधित नहीं करते हैं, तो इसे local चर पर कॉपी करने की कोई आवश्यकता नहीं है - बस echo "Hello, $1"

  2. आप फ़ंक्शन के अंदर तर्कों का उपयोग करने के लिए $1 , $2 , $3 और इतने पर उपयोग कर सकते हैं।

    नोट: 9 $10 से अधिक तर्क के लिए काम नहीं करेगा (बैश इसे $ 1 0 के रूप में पढ़ेगा), आपको ${10} , ${11} और इतने पर करने की आवश्यकता है।

  3. $@ किसी फ़ंक्शन के सभी तर्कों को संदर्भित करता है:

    #!/bin/bash
    foo() {
      echo "$@"
    }
    
    foo 1 2 3 # output => 1 2 3
    

    नोट: आपको व्यावहारिक रूप से हमेशा "$@" आसपास दोहरे उद्धरण चिह्नों का उपयोग करना चाहिए, जैसे यहां।

    उद्धरणों को छोड़ने से शेल वाइल्डकार्ड का विस्तार होगा (तब भी जब उपयोगकर्ता विशेष रूप से उनसे बचने के लिए उद्धृत करता है) और आम तौर पर अवांछित व्यवहार और संभावित रूप से सुरक्षा समस्याओं का भी परिचय देता है।

    foo "string with spaces;" '$HOME' "*"
    # output => string with spaces; $HOME *
    
  4. डिफ़ॉल्ट तर्कों के लिए ${1:-default_val} । उदाहरण के लिए:

    #!/bin/bash
    foo() {
      local val=${1:-25}
      echo "$val"
    }
    
    foo     # output => 25
    foo 30  # output => 30
    
  5. एक तर्क का उपयोग करने के लिए ${var:?error message} आवश्यकता होती है

    foo() {
      local val=${1:?Must provide an argument}
      echo "$val"
    }
    

किसी फ़ंक्शन से मान लौटाएं

बैश में return स्टेटमेंट सी-फंक्शंस की तरह कोई वैल्यू नहीं लौटाता है, इसके बजाय यह फंक्शन को रिटर्न स्टेटस से बाहर निकाल देता है। आप इसे उस फ़ंक्शन की निकास स्थिति के रूप में सोच सकते हैं।

आप समारोह से एक मूल्य के वापस जाने के लिए चाहते हैं, तो करने के लिए मूल्य भेज stdout इस तरह:

fun() {
    local var="Sample value to be returned"
    echo "$var"
    #printf "%s\n" "$var"
}

अब, यदि आप करते हैं:

var="$(fun)"

fun का आउटपुट $var में संग्रहीत किया जाएगा।

झंडे और वैकल्पिक मापदंडों को संभालना

गेटटॉप बिल्डिन का उपयोग फ़ंक्शंस और वैकल्पिक मापदंडों को समायोजित करने वाले कार्यों को लिखने के लिए किया जा सकता है। यह कोई विशेष कठिनाई प्रस्तुत नहीं करता है लेकिन किसी को उचित रूप से गेटटॉप्स द्वारा छुआ जाने वाले मूल्यों को संभालना पड़ता है । एक उदाहरण के रूप में, हम एक फेल्विथ फ़ंक्शन को परिभाषित करते हैं जो stderr पर एक संदेश लिखता है और कोड 1 के साथ बाहर निकलता है या -x विकल्प के पैरामीटर के रूप में आपूर्ति की गई एक मनमाना कोड है:

# failwith [-x STATUS] PRINTF-LIKE-ARGV
#  Fail with the given diagnostic message
#
# The -x flag can be used to convey a custom exit status, instead of
# the value 1.  A newline is automatically added to the output.

failwith()
{
    local OPTIND OPTION OPTARG status

    status=1
    OPTIND=1

    while getopts 'x:' OPTION; do
        case ${OPTION} in
            x)    status="${OPTARG}";;
            *)    1>&2 printf 'failwith: %s: Unsupported option.\n' "${OPTION}";;
        esac
    done

    shift $(( OPTIND - 1 ))
    {
        printf 'Failure: '
        printf "$@"
        printf '\n'
    } 1>&2
    exit "${status}"
}

इस फ़ंक्शन का उपयोग निम्नानुसार किया जा सकता है:

failwith '%s: File not found.' "${filename}"
failwith -x 70 'General internal error.'

और इसी तरह।

ध्यान दें कि प्रिंटफ के लिए , चर को पहले तर्क के रूप में उपयोग नहीं किया जाना चाहिए। यदि प्रिंट करने के लिए संदेश में एक चर की सामग्री शामिल है, तो किसी को इसे प्रिंट करने के लिए %s स्पेसियर का उपयोग करना चाहिए, जैसे

failwith '%s' "${message}"

किसी फ़ंक्शन का एक्ज़िट कोड उसके अंतिम कमांड का एक्ज़िट कोड होता है

एक मेजबान है अगर जाँच करने के लिए इस उदाहरण समारोह पर विचार करें:

is_alive() {
    ping -c1 "$1" &> /dev/null
}

यह फ़ंक्शन पहले फ़ंक्शन पैरामीटर द्वारा निर्दिष्ट होस्ट को एक एकल पिंग भेजता है। ping का आउटपुट और एरर आउटपुट दोनों को /dev/null रीडायरेक्ट किया जाता है, इसलिए फ़ंक्शन कभी भी कुछ भी आउटपुट नहीं करेगा। लेकिन ping कमांड में सफलता पर निकास कोड 0 होगा, और विफलता पर गैर-शून्य। चूंकि यह फ़ंक्शन का अंतिम (और इस उदाहरण में, एकमात्र) कमांड है, फ़ंक्शन के निकास कोड के लिए ping के निकास कोड का पुन: उपयोग किया जाएगा।

यह तथ्य सशर्त बयानों में बहुत उपयोगी है।

उदाहरण के लिए, यदि मेजबान graucho ऊपर है, तो इसे ssh कनेक्ट करें:

if is_alive graucho; then
    ssh graucho
fi

एक और उदाहरण: बार-बार जाँच जब तक मेजबान graucho ऊपर है, और फिर इसे ssh साथ कनेक्ट करें:

while ! is_alive graucho; do
    sleep 5
done
ssh graucho

फ़ंक्शन परिभाषा प्रिंट करें

getfunc() {
    declare -f "$@"
}

function func(){
    echo "I am a sample function"
}

funcd="$(getfunc func)" 
getfunc func # or echo "$funcd"

आउटपुट:

func () 
{ 
    echo "I am a sample function"
}

एक फ़ंक्शन जो मापदंडों को नामित करता है

foo() {
  while [[ "$#" -gt 0 ]]
  do
    case $1 in
      -f|--follow)
        local FOLLOW="following"
        ;;
      -t|--tail)
        local TAIL="tail=$2"
        ;;
    esac
    shift
  done

  echo "FOLLOW: $FOLLOW"
  echo "TAIL: $TAIL"
}

उदाहरण उपयोग:

foo -f
foo -t 10
foo -f --tail 10
foo --follow --tail 10


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