2010-10-19 24 views
26

फ़ंक्शन के अंदर, $1 ... $n उस फ़ंक्शन पर दिए गए पैरामीटर हैं। फ़ंक्शन के बाहर $1 ... $n स्क्रिप्ट को पारित पैरामीटर हैं।फ़ंक्शन के अंदर बैश स्क्रिप्ट के लिए एक्सेस तर्क

क्या मैं किसी फ़ंक्शन के अंदर स्क्रिप्ट को पारित पैरामीटर तक पहुंच सकता हूं?

उत्तर

20

आमतौर पर आप उन्हें कॉल समय पर फ़ंक्शन के पैरामीटर के रूप में पास करते हैं।

(uglier) विकल्प उन्हें वैश्विक चर में रखना है।

3

आपको शायद "[email protected]" का उपयोग करना चाहिए और अपने फ़ंक्शन की तर्क सूची के अंत में इसे पास करना चाहिए। अपने तर्कों को पार्स करने के बाद फ़ंक्शन के अंदर, shift और सामान्य रूप से $1 से $n का उपयोग करें।

6

आप एक वैश्विक सरणी में अपनी स्क्रिप्ट तर्क के सभी स्टोर कर सकते हैं:

args=("[email protected]") 

और उसके बाद एक समारोह में पहुंच बनाएं:

f(){ 
    echo ${args[0]} ${args[1]} 
} 
+1

मुझे लगता है कि 'समारोह च() {' मान्य नहीं है। आपको 'f() {' या 'function f {' के बजाय उपयोग करना चाहिए। – Benoit

+0

मैंने अपना जवाब सही कर दिया है, लेकिन 'फ़ंक्शन f() {}' ने मेरे लिए काम किया है। – dogbane

16

(मुझे पता है, यह एक पुरानी पोस्ट है, लेकिन कोई भी जवाबों में वास्तव में प्रश्न का उत्तर दिया गया।)

BASH_ARGV सरणी का उपयोग करें। इसमें उल्टा स्क्रिप्ट में रिवर्स ऑर्डर में दिए गए तर्क शामिल हैं (यानी, यह इंडेक्स 0 पर शीर्ष पर एक स्टैक है)। आपको शेबैंग में विस्तारित डिबगिंग चालू करना पड़ सकता है (उदा।, #!/bin/bash -O extdebug) या shopt (उदा।, shopt -s extdebug) के साथ, लेकिन यह मेरे लिए चालू होने के बिना bash 4.2_p37 में काम करता है।

man bash से:

एक सरणी वर्तमान बैश निष्पादन कॉल स्टैक में पैरामीटर के सभी युक्त चर। अंतिम सबराउटिन कॉल का अंतिम पैरामीटर ढेर के शीर्ष पर है; प्रारंभिक कॉल का पहला पैरामीटर नीचे है। जब एक subroutine निष्पादित किया जाता है, आपूर्ति किए गए पैरामीटर BASH_ARGV पर धक्का दिया जाता है। खोल केवल BASH_ARGV सेट करता है जब विस्तारित डीबगिंग मोड में ...।

यहाँ एक समारोह मैं एक ही लाइन पर क्रम में सभी तर्कों को मुद्रित करने के लिए उपयोग:

# Print the arguments of the calling script, in order. 
function get_script_args 
{ 
    # Get the number of arguments passed to this script. 
    # (The BASH_ARGV array does not include $0.) 
    local n=${#BASH_ARGV[@]} 

    if (($n > 0)) 
    then 
     # Get the last index of the args in BASH_ARGV. 
     local n_index=$(($n - 1)) 

     # Loop through the indexes from largest to smallest. 
     for i in $(seq ${n_index} -1 0) 
     do 
      # Print a space if necessary. 
      if (($i < $n_index)) 
      then 
       echo -n ' ' 
      fi 

      # Print the actual argument. 
      echo -n "${BASH_ARGV[$i]}" 
     done 

     # Print a newline. 
     echo 
    fi 
} 
+0

जानना अच्छा है। हालांकि विस्तारित डीबगिंग थोड़ा डरावना लगता है। – zedoo

10

के रूप में बेनोइट ने कहा, सबसे आसान समाधान [email protected] साथ समारोह तर्क के रूप में कार्य करने के लिए कमांडलाइन तर्क पारित करने के लिए है , तो आप उन्हें फ़ंक्शन के बाहर बिल्कुल उसी तरह संदर्भित कर सकते हैं। आप वास्तव में उस फ़ंक्शन पर दिए गए मानों का संदर्भ दे रहे हैं जो कमांडलाइन तर्कों के समान मूल्य के समान होते हैं, इसे ध्यान में रखें।

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

यानी

function fname { 
    # do something with $1 $2 $3...$n # 
    } 

    # [email protected] represents all the arguments passed at the command line # 
    fname [email protected] 

एक बेहतर तरीका केवल तर्क आप जानते हैं कि आप का उपयोग किया जाएगा पारित करने के लिए, इस तरह आप समारोह में उन्हें इस्तेमाल और भी अपने कोड के भीतर से अन्य पैरामीटर भेजने यदि आप चाहें तो कर सकते हैं

यानी

function fname { 
    # do something with $1 $count $2 and $3 # 
    } 

    count=1 
    fname $1 $count $2 $3 
+2

आप तर्क सूची की शुरुआत में फ़ंक्शन में निश्चित संख्या में तर्कों को पारित कर सकते हैं और फिर उन्हें छोड़ने के लिए फ़ंक्शन का उपयोग 'शिफ्ट' का उपयोग करने के बाद। ** फंक्शन कॉल: ** 'fname farg1 farg2 farg3 "$ @" '** तीन तर्कों को संसाधित करने के बाद फ़ंक्शन में: **' shift 3' – pabouk

+0

यह एक अच्छा बिंदु है। – CaffeineConnoisseur

+1

इसके अलावा आप यह भी कह सकते हैं कि $ # का उपयोग करके कितने उपयोगकर्ता तर्क हैं, आप न केवल अतिरिक्त तर्क निर्दिष्ट करने की अनुमति देते हैं, बल्कि इसके बाद भी: 'fname firstarg $ # "$ @" afterarg' –

0

युक्तियों के लिए धन्यवाद - उन्होंने मुझे कॉलस्टैक फ़ंक्शन लिखने के लिए प्रेरित किया। मैंने एस्थेटिक्स के लिए 'कॉलम' कमांड का इस्तेमाल किया।

callstack() { 
    local j=0 k prog=$(basename $0) 
    for ((i=1; ((i<${#BASH_ARGC[*]})); i++)) 
    do 
     echo -n "${FUNCNAME[$i]/main/$prog} " # function name 
     args="" 
     for ((k=0; ((k<${BASH_ARGC[$i]})); k++)) 
     do 
      args="${BASH_ARGV[$j]} $args" # arguments 
      let j++ 
     done 
     echo -e "$args\t|${BASH_LINENO[$i]}" $(sed -n ${BASH_LINENO[$i]}p "$0" 2>/dev/null) # line calling the function 
    done | column -t -s $'\t' -o ' ' | sed 1d # delete callstack entry 
} 
 
compareTemplates brother_001270_1.jpg  |163 compareTemplates "$f" # process the rest 
processPdf brother_001270.pdf    |233 filetype "${f%[*}" pdf && processPdf "$f" 
process brother_001270.pdf    |371 --process) shift; process "[email protected]"; exit ;; # process jpg or pdf 
sm --quiet --process brother_001270.pdf |0 
संबंधित मुद्दे