2010-10-21 14 views

उत्तर

4

bash manual का कहना है:

एक सरणी के आकार कोई अधिकतम सीमा, और न ही किसी भी आवश्यकता है कि सदस्यों अनुक्रमित या समीपवर्ती सौंपा जा सकता है।

मुझे विश्वास है कि यह लागू होता है, क्योंकि फ़ंक्शन तर्क एक सरणी के रूप में प्रस्तुत किए जाते हैं।

10

एक समारोह में तर्क का उपयोग करने के लिए आपको उन पर पुनरावृति कर सकते हैं:

foo() { 
    for arg # "in [email protected]" is implied 
    do 
     echo $arg 
    done 
} 

या

bar() { 
    while [ $1 ] 
    do 
     echo $1 
     shift 
    done 
} 

या विशिष्ट तर्क का उपयोग करने की:

baz() { 
    # for arguments above $9 you have to use curly braces 
    echo $1 $9 ${10} ${121375} 
} 
4

संख्या काफी बड़ी है :

$ display_last_arg() { echo "${@: -1}"; } 
$ getconf ARG_MAX 
262144 
$ display_last_arg {1..262145} 
262145 
$ echo $((2**18)) $((2**20)) 
262144 1048576 
$ display_last_arg {1..1048576} 
1048576 

जैसा कि आप देख सकते हैं, यह the kernel ARG_MAX limit से बड़ा है, जो समझ में आता है क्योंकि बैश execve(2) को बाश-परिभाषित कार्यों को आमंत्रित करने के लिए कॉल नहीं करता है।

मैं malloc विफलताओं मिलता है अगर मैं 2^32 श्रृंखला में बैश अनुक्रम विस्तार ({1..NUM}) प्रदर्शन करने के लिए प्रयास करते हैं, तो एक हार्ड सीमा (आपकी मशीन पर भिन्न हो सकता है) कहीं वहाँ है, लेकिन बैश इतनी धीमी गति से है एक बार आप ऊपर प्राप्त 2^20 तर्क, कि आप हार्ड सीमा को हिट करने से पहले एक प्रदर्शन सीमा को अच्छी तरह से मार देंगे।

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