लिनक्स में $ * और $ # क्या है?


82

लिनक्स में निम्नलिखित पर्यावरण चर क्या हैं?

  1. $ * क्या है (तारांकन के बाद डॉलर का चिह्न)?
  2. $ # (हैश मार्क / नंबर साइन / ऑक्टोथोरपे / पाउंड साइन के बगल में डॉलर का चिह्न) क्या है?

जवाबों:


114

से यहाँ :

$#    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
सभी बॉर्न-व्युत्पन्न गोले (जैसे श, बश, डैश, राख, क्ष, ज़श) में वे विशेष पैरामीटर सही हैं।
डेनिस विलियमसन

सुधार: $*और $#1) शेल चर हैं, पर्यावरण चर नहीं; 2) मानकीकृत (POSIX कल्पना का हिस्सा।)
विशाल

3
यह भी ध्यान दें कि "$@"कई बार ${1+"$@"}(पोर्टेबिलिटी कारणों से) लिखा जाता है , स्पष्टीकरण के लिए stackoverflow.com/questions/743454/… देखें ।
होवडाल

चूंकि 'कमांड नाम (पैरामीटर 0) को गिना नहीं जाएगा ...', उदाहरण में ऊपर $ # = 2 होना चाहिए, 0. से गिनती शुरू
जोसेफ क्लिमुक

0

$# तर्कों की संख्या का प्रतिनिधित्व करता है:

[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1

[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3

2
सुपर उपयोगकर्ता में आपका स्वागत है। साइट एक ज्ञान का आधार है, इसलिए आशय यह है कि प्रत्येक उत्तर उस प्रश्न का हल प्रदान करता है जिसका पहले से योगदान नहीं है। यह केवल आधे प्रश्न को संबोधित करता है, और जानकारी पहले से ही पिछले उत्तर में अच्छी तरह से कवर होती है।
फिक्सर 1234
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.