जवाबों:
से यहाँ :
$# Stores the number of command-line arguments that
were passed to the shell program.
$? Stores the exit value of the last command that was
executed.
$0 Stores the first word of the entered command (the
name of the shell program).
$* Stores all the arguments that were entered on the
command line ($1 $2 ...).
"$@" Stores all the arguments that were entered
on the command line, individually quoted ("$1" "$2" ...).
तो मूल रूप से, $#आपकी स्क्रिप्ट निष्पादित होने पर दिए गए कई तर्क हैं। $*सभी तर्कों वाली एक स्ट्रिंग है। उदाहरण के लिए, $1पहला तर्क वगैरह है। यह उपयोगी है, यदि आप अपनी स्क्रिप्ट में एक विशिष्ट तर्क का उपयोग करना चाहते हैं।
जैसा कि ब्रायन ने टिप्पणी की, यहां एक सरल उदाहरण है। यदि आप निम्न आदेश चलाते हैं:
./command -yes -no /home/username
$# = ३$* = -yes -no /home/username$@ = सरणी: {"-yes", "-no", "/home/username"}$0= ./command, $1= -yesआदि।ये POSIX मानक का हिस्सा हैं , और सभी आज्ञाकारी गोले द्वारा समर्थित होना चाहिए। संदर्भ के लिए, नीचे प्रत्येक विशेष पैरामीटर के लिए POSIX मानक परिभाषा है। ध्यान दें है वहाँ तीन अतिरिक्त चर है: $-, $$और $!।
$@:
एक से शुरू होकर, स्थितिगत मापदंडों का विस्तार करता है। जब विस्तार दोहरे कोट्स के भीतर होता है, और जहां फ़ील्ड विभाजन ( फ़ील्ड विभाजन देखें ) किया जाता है, तो प्रत्येक स्थिति पैरामीटर को एक अलग फ़ील्ड के रूप में विस्तारित किया जाएगा, इस प्रावधान के साथ कि पहले पैरामीटर का विस्तार अभी भी शुरुआत के भाग के साथ शामिल हो जाएगा मूल शब्द (यह मानते हुए कि विस्तारित पैरामीटर एक शब्द के भीतर एम्बेडेड था), और अंतिम पैरामीटर का विस्तार अभी भी मूल शब्द के अंतिम भाग के साथ जुड़ जाएगा। यदि कोई स्थितिगत पैरामीटर नहीं हैं, तो '@' का विस्तार शून्य क्षेत्र उत्पन्न करेगा, यहां तक कि '@' दोहरे-उद्धृत होने पर भी।
$*:
एक से शुरू होकर, स्थितिगत मापदंडों का विस्तार करता है। जब विस्तार एक डबल-उद्धृत स्ट्रिंग ( डबल-उद्धरण देखें ) के भीतर होता है , तो यह आईएफएस चर के पहले चरित्र द्वारा अलग किए गए प्रत्येक पैरामीटर के मान के साथ एकल फ़ील्ड में विस्तारित हो सकता है, या यदि आईएफएस परेशान है। यदि IFS एक अशक्त स्ट्रिंग पर सेट है, तो यह इसे परेशान करने के बराबर नहीं है; इसका पहला वर्ण मौजूद नहीं है, इसलिए पैरामीटर मान संक्षिप्त हैं।
$#:
स्थितीय मापदंडों के दशमलव संख्या में विस्तार। कमांड नाम (पैरामीटर 0) को '#' द्वारा दी गई संख्या में नहीं गिना जाएगा, क्योंकि यह एक विशेष पैरामीटर है, न कि कोई स्थिति पैरामीटर।
$?:
सबसे हालिया पाइपलाइन (देखें पाइपलाइन ) के दशमलव निकास की स्थिति का विस्तार करता है ।
$-:
(हाइफन।) वर्तमान विकल्प झंडे (एकल अक्षर का विकल्प नाम एक स्ट्रिंग में concatenated), मंगलाचरण पर निर्दिष्ट के रूप में द्वारा करने के लिए विस्तार सेट में निर्मित आदेश, या परोक्ष खोल द्वारा विशेष।
$$:
आमंत्रित शेल के दशमलव प्रक्रिया आईडी के लिए फैलता है। एक सबशेल ( शैल निष्पादन पर्यावरण देखें ) में, '$' मौजूदा शेल के समान ही विस्तारित होगा।
$!:
वर्तमान शेल से निष्पादित सबसे हालिया पृष्ठभूमि कमांड ( सूची देखें ) की दशमलव प्रक्रिया आईडी का विस्तार करता है । (उदाहरण के लिए, उपधाराओं से निष्पादित पृष्ठभूमि आदेश वर्तमान शेल वातावरण में "$!" के मूल्य को प्रभावित नहीं करते हैं।) एक पाइपलाइन के लिए, प्रक्रिया आईडी पाइपलाइन में अंतिम कमांड की है।
$0:
(शून्य।) शेल या शेल स्क्रिप्ट के नाम का विस्तार करता है। यह नाम कैसे व्युत्पन्न है, इसके विस्तृत विवरण के लिए sh देखें ।
$*और $#1) शेल चर हैं, पर्यावरण चर नहीं; 2) मानकीकृत (POSIX कल्पना का हिस्सा।)
"$@"कई बार ${1+"$@"}(पोर्टेबिलिटी कारणों से) लिखा जाता है , स्पष्टीकरण के लिए stackoverflow.com/questions/743454/… देखें ।
$# तर्कों की संख्या का प्रतिनिधित्व करता है:
[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1
[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3