$#
तर्कों की संख्या है, लेकिन याद रखें कि यह एक फ़ंक्शन में भिन्न होगी।
$#
स्क्रिप्ट, शेल या शेल फ़ंक्शन को पारित किए गए स्थितीय मापदंडों की संख्या है । ऐसा इसलिए है, क्योंकि शेल फ़ंक्शन चल रहा है, स्थिति संबंधी पैरामीटर अस्थायी रूप से फ़ंक्शन के तर्कों के साथ बदल दिए जाते हैं । इससे फ़ंक्शन अपने स्वयं के स्थितीय मापदंडों को स्वीकार करते हैं और उपयोग करते हैं।
यह स्क्रिप्ट हमेशा प्रिंट करती है 3
, भले ही स्क्रिप्ट में कितने तर्क पास किए गए हों, क्योंकि "$#"
फ़ंक्शन में फ़ंक्शन के f
लिए दिए गए तर्कों की संख्या तक विस्तार होता है:
#!/bin/sh
f() {
echo "$#"
}
f a b c
यह महत्वपूर्ण है क्योंकि इसका मतलब है कि इस तरह का कोड काम नहीं करता है जैसा कि आप उम्मीद कर सकते हैं, यदि आप परिचित नहीं हैं कि शेल के कार्यों में स्थितीय पैरामीटर कैसे काम करते हैं:
#!/bin/sh
check_args() { # doesn't work!
if [ "$#" -ne 2 ]; then
printf '%s: error: need 2 arguments, got %d\n' "$0" "$#" >&2
exit 1
fi
}
# Maybe check some other things...
check_args
# Do other stuff...
में check_args
, $#
फंक्शन में पास किए गए तर्कों की संख्या तक विस्तार होता है, जो उस स्क्रिप्ट में हमेशा 0 होता है।
यदि आप शेल फ़ंक्शन में ऐसी कार्यक्षमता चाहते हैं, तो आपको इसके बजाय कुछ इस तरह लिखना होगा:
#!/bin/sh
check_args() { # works -- the caller must pass the number of arguments received
if [ "$1" -ne 2 ]; then
printf '%s: error: need 2 arguments, got %d\n' "$0" "$1" >&2
exit 1
fi
}
# Maybe check some other things...
check_args "$#"
यह काम करता है क्योंकि फ़ंक्शन के बाहर$#
विस्तारित होता है और फ़ंक्शन के पास इसके स्थितीय मापदंडों में से एक के रूप में पारित किया जाता है । फ़ंक्शन के अंदर, उस स्क्रिप्ट का हिस्सा होने के बजाय शेल फ़ंक्शन को दिए गए पहले स्थितीय पैरामीटर को विस्तारित करता है, जिसका वह हिस्सा है।$1
इस प्रकार, जैसे $#
, विशेष पैरामीटर $1
, $2
आदि, साथ ही $@
और $*
, फ़ंक्शन में दिए गए तर्कों से भी संबंधित होते हैं, जब वे फ़ंक्शन में विस्तारित होते हैं। हालांकि, $0
करता नहीं क्यों मैं अभी भी इसका इस्तेमाल करने के लिए एक गुणवत्ता त्रुटि संदेश का उत्पादन करने में सक्षम था समारोह है, जो के नाम करने के लिए बदल जाते हैं।
$ ./check-args-demo a b c
./check-args-demo: error: need 2 arguments, got 3
इसी तरह, यदि आप एक फ़ंक्शन को दूसरे के अंदर परिभाषित करते हैं, तो आप उस अंतरतम पैरामीटर के साथ काम कर रहे हैं जो अंतरतम फ़ंक्शन को दिया जाता है जिसमें विस्तार किया जाता है:
#!/bin/sh
outer() {
inner() {
printf 'inner() got %d arguments\n' "$#"
}
printf 'outer() got %d arguments\n' "$#"
inner x y z
}
printf 'script got %d arguments\n' "$#"
outer p q
मैंने इस स्क्रिप्ट को बुलाया nested
और (चलाने के बाद chmod +x nested
) मैंने इसे चलाया:
$ ./nested a
script got 1 arguments
outer() got 2 arguments
inner() got 3 arguments
हाँ मैं जानता हूँ। "" तर्क "एक बहुवचन बग है।
स्थितिगत मापदंडों को भी बदला जा सकता है।
यदि आप एक स्क्रिप्ट लिख रहे हैं, तो एक फ़ंक्शन के बाहर स्थित स्थिति के पैरामीटर स्क्रिप्ट के पास दिए गए कमांड-लाइन तर्क होंगे जब तक कि आपने उन्हें नहीं बदला है ।
उन्हें बदलने का एक सामान्य तरीका shift
बिलिन के साथ है , जो प्रत्येक स्थितीय पैरामीटर को एक से बाईं ओर बदलता है, पहले को छोड़ता है और $#
1 से घटता है:
#!/bin/sh
while [ "$#" -ne 0 ]; do
printf '%d argument(s) remaining.\nGot "%s".\n\n' "$#" "$1"
shift
done
$ ./do-shift foo bar baz # I named the script do-shift.
3 argument(s) remaining.
Got "foo".
2 argument(s) remaining.
Got "bar".
1 argument(s) remaining.
Got "baz".
उन्हें set
बिलिन के साथ भी बदला जा सकता है :
#!/bin/sh
printf '%d args: %s\n' "$#" "$*"
set foo bar baz
printf '%d args: %s\n' "$#" "$*"
$ ./set-args a b c d e # I named the script set-args.
5 args: a b c d e
3 args: foo bar baz
$#
? आपकी क्या प्राप्त करने की इच्छा है? आपको यह आज्ञा कहां से मिली। यह बिल्कुल भी प्रासंगिक नहीं है।