विशेष डॉलर साइन शेल चर क्या हैं?


781

बैश में, कई चर दिखाई देते हैं जो विशेष, निरंतर-अर्थ मान रखते हैं। उदाहरण के लिए,

./myprogram &; echo $!

प्रक्रिया की पीआईडी ​​वापस करेगा जो पृष्ठभूमि में थी myprogram। मुझे दूसरों के बारे में पता है, जैसे कि $?मुझे लगता है कि वर्तमान TTY है। क्या अन्य हैं?


15
उनमें से कई बाश-केवल नहीं हैं। उनका उपयोग अन्य बॉर्न-संबंधित गोले में भी किया जाता है और वास्तव में पोसिक्स द्वारा निर्दिष्ट किया जाता है ।
अगली सूचना तक रोक दिया गया।

1
के बारे में क्या: IFS = $ '\ n' देखें: stackoverflow.com/questions/4128235/…
sgu

1
@sgu यह एक पैरामीटर नहीं है; यह एक विशेष प्रकार का उद्धरण है। $'\n'एक शाब्दिक न्यूलाइन वर्ण है जिसका परिणाम \nASCII 10. के साथ
डिग्राफ

यदि आप यहाँ आया की तलाश में ${1}, ${*}, आदि, ब्रेसिज़ सिर्फ बहुविकल्पी के लिए कर रहे हैं, और अक्सर अनावश्यक। अलगाव में, इसके ${x}बिल्कुल बराबर है $x
ट्रिपल जूल

क्या $!मतलब है? मुझे पता है !$लेकिन ऐसा नहीं है।
श्रीधर सरनोबत

जवाबों:


1357
  • $1, $2, $3, ... हैं स्थितीय मापदंडों
  • "$@"एक सरणी की तरह सभी स्थितीय मापदंडों का निर्माण, है {$1, $2, $3 ...}
  • "$*"सभी स्थितिगत मापदंडों का IFS विस्तार है $1 $2 $3 ...
  • $# स्थितीय मापदंडों की संख्या है।
  • $- खोल के लिए वर्तमान विकल्प सेट।
  • $$ वर्तमान शेल का पिंड (उपसमूह नहीं)।
  • $_ सबसे हालिया पैरामीटर (या स्टार्टअप के तुरंत बाद वर्तमान शेल शुरू करने के लिए कमांड का अनुपस्थित पथ)।
  • $IFS (इनपुट) क्षेत्र विभाजक है।
  • $? सबसे हालिया अग्रभूमि पाइपलाइन निकास स्थिति है।
  • $! सबसे हालिया पृष्ठभूमि कमांड का पीआईडी ​​है।
  • $0 शेल या शेल स्क्रिप्ट का नाम है।

उपरोक्त में से अधिकांश को बैश संदर्भ नियमावली में विशेष पैरामीटर के तहत पाया जा सकता है । शेल द्वारा निर्धारित सभी पर्यावरण चर हैं

एक व्यापक सूचकांक के लिए, कृपया संदर्भ मैनुअल चर सूचकांक देखें


2
वे सभी bashआदमी पृष्ठ में प्रलेखित हैं । केवल विषमता $_केवल MAILPATHचर में इसके उपयोग के संदर्भ में उल्लिखित है ।
शेपनर

4
@chepner बाकी की परिभाषा के लिए विशेष पैरामीटर केman(1) bash तहत देखो । $_
कोजिरो

8
मैं बैश स्क्रिप्ट के !$बजाय उपयोग करता हूं $_, क्योंकि बाद वाला कभी-कभी विफल हो जाता है।
amc

अच्छी सूची kojiro। मैं इस सिंटैक्स $ {1 + "$ @"} पर भागा, इसका क्या मतलब है?
user178047

3
@amc: देखें unix.stackexchange.com/questions/271659/... के बीच मतभेद के लिए !$और $_
tricasse

44
  • $_ अंतिम आदेश का अंतिम तर्क
  • $# वर्तमान स्क्रिप्ट में दिए गए तर्कों की संख्या
  • $*/ $@स्ट्रिंग / सीमांकित सूची के रूप में स्क्रिप्ट के लिए पारित तर्कों की सूची

मेरे सर के ऊपर से चला गया। Google विशेष बैश चर के लिए।


124
"मैंने किया। उन्होंने मुझे यहां भेजा।" - बुकशॉप स्किट (आधिकारिक डॉक्टर: gnu.org/software/bash/manual/bashref.html#Special-Parameters )
greggo

1
मुझे लगता $@है कि स्ट्रिंग है और $*सीमांकित सूची है (ऊपर स्वीकार किए गए उत्तर के अनुसार, वैसे भी)।
रस्तजेडी

1
@RastaJedi: "$@"एक सूची में "$*"फैलता है , एक स्ट्रिंग में फैलता है। $@दोहरे उद्धरण चिह्नों के भीतर होने पर यह विशेष व्यवहार लागू होता है।
कीथ थॉम्पसन

6
डाउनवोट किया गया क्योंकि यह बहुत पूर्ण या सहायक उत्तर नहीं है। "Google यह" कहना एक प्रयास की कमी को दर्शाता है, विशेष रूप से यह देखते हुए कि अधिकांश लोग Google खोज से यहां समाप्त होते हैं। मुझे लगता है कि आप कम से कम आधिकारिक प्रलेखन के लिए लिंक जोड़ सकते हैं। टीबीएच, एकमात्र कारण मैंने इसे हटाने के लिए ध्वजांकित नहीं किया था क्योंकि यह कम से कम प्रश्न का आंशिक उत्तर था। मुझे पता है कि यह पुराना है, लेकिन कृपया अधिक विस्तार प्रदान करने के लिए इसे संपादित करने पर विचार करें।
बीन

15

यह समझने में मदद करने के लिए कि मुझे क्या करना है $#, $0और $1, ... $n, मैं इस स्क्रिप्ट का उपयोग करता हूं:

#!/bin/bash

for ((i=0; i<=$#; i++)); do
  echo "parameter $i --> ${!i}"
done

इसे चलाने से प्रतिनिधि आउटपुट प्राप्त होता है:

$ ./myparams.sh "hello" "how are you" "i am fine"
parameter 0 --> myparams.sh
parameter 1 --> hello
parameter 2 --> how are you
parameter 3 --> i am fine

4
लूप के लिए आपके पास क्या मतलब है? यही कारण है कि मैं यहां हूं और मुझे इसका जवाब कहीं भी नहीं मिल रहा है क्योंकि मुझे नहीं पता कि इसे क्या कहा जाए।
एंथनी

7
@ एंथनी इसे वेरिएबल इनडायरेक्शन कहते हैं । आप बैश में उसके उपयोग का एक अच्छा अन्वेषण पा सकते हैं : अप्रत्यक्ष विस्तार, कृपया समझाएं?
फेडोरक्वी 'एसओ ने

3

कुछ उदाहरणों का ध्यान रखें; $ 0 में कुछ प्रमुख पथ के साथ-साथ कार्यक्रम का नाम भी शामिल हो सकता है। जैसे इस दो लाइन स्क्रिप्ट को .mytry.sh पर सहेजें और इसे निष्पादित करें।

#!/bin/bash

echo "parameter 0 --> $0" ; exit 0

आउटपुट:

parameter 0 --> ./mytry.sh

यह स्लैकवेयर 14.2 के माध्यम से बैश के वर्तमान (वर्ष 2016) संस्करण पर है


5
$ 0 में एक पथ शामिल है या नहीं, यह इस बात पर निर्भर करता है कि आपने स्क्रिप्ट को पहले स्थान पर कैसे चलाया था। यदि आपने "./mytry.sh" निष्पादित किया है, तो आप $ 0 में देखेंगे। यदि आपने "~ / mytry.sh" दर्ज किया है, तो आपको पूर्ण पथ दिखाई देगा (क्योंकि शेल का विस्तार होगा ~)। अगर आपने "mytry.sh" किया तो आप 'बैश' देखेंगे।
स्टीव फोली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.