खोज…


परिचय

बैश के आंतरिक चर का अवलोकन, जहां, कैसे और कब उनका उपयोग करना है।

एक नज़र में बैश आंतरिक चर

परिवर्तनशील विवरण
$* / $@ समारोह / स्क्रिप्ट स्थिति संबंधी पैरामीटर (तर्क)। इस प्रकार विस्तार करें:

$* और $@ $1 $2 ... (ध्यान दें कि यह आमतौर पर उन लोगों को छोड़ने का कोई मतलब नहीं है)
"$*" "$1 $2 ..." 1 के समान है
"$@" "$1" "$2" ...
1. तर्क $ IFS के पहले चरित्र द्वारा अलग किए जाते हैं, जिसमें स्थान नहीं होना चाहिए।
$# स्क्रिप्ट या फ़ंक्शन को पारित किए गए स्थितीय मापदंडों की संख्या
$! सबसे हाल की नौकरी में अंतिम (righ- सबसे पाइपलाइनों के लिए) कमांड प्रक्रिया पृष्ठभूमि में डाल दी जाती है (ध्यान दें कि नौकरी नियंत्रण प्रक्रिया सक्षम होने पर नौकरी की प्रक्रिया समूह आईडी के समान नहीं है)
$$ उस प्रक्रिया की आईडी जो bash निष्पादित करती है
$? अंतिम आदेश की स्थिति से बाहर निकलें
$n स्थितिगत पैरामीटर, जहां n = 1, 2, 3, ..., 9
${n} स्थितिगत पैरामीटर (ऊपर जैसा), लेकिन n> 9 हो सकता है
$0 लिपियों में, वह पथ जिसके साथ लिपि को आमंत्रित किया गया था; bash -c 'printf "%s\n" "$0"' name args' साथ bash -c 'printf "%s\n" "$0"' name args' : name (इनलाइन स्क्रिप्ट के बाद पहला तर्क), अन्यथा, उस bash को प्राप्त argv[0]
$_ अंतिम कमांड का अंतिम क्षेत्र
$IFS आंतरिक क्षेत्र विभाजक
$PATH PATH पर्यावरण वैरिएबल लुक-अप निष्पादन योग्य का उपयोग करता है
$OLDPWD पिछले काम निर्देशिका
$PWD वर्तमान कार्यशील निर्देशिका
$FUNCNAME निष्पादन कॉल स्टैक में फ़ंक्शन नामों की सरणी
$BASH_SOURCE FUNCNAME सरणी में तत्वों के लिए स्रोत पथ युक्त सरणी। स्क्रिप्ट पथ प्राप्त करने के लिए उपयोग किया जा सकता है।
$BASH_ALIASES साहचर्य सरणी जिसमें सभी वर्तमान में परिभाषित उपनाम हैं
$BASH_REMATCH पिछले रेगेक्स मैच से मैचों का एरियर
$BASH_VERSION बैश संस्करण स्ट्रिंग
$BASH_VERSINFO बैश संस्करण की जानकारी के साथ 6 तत्वों की एक सरणी
$BASH वर्तमान में बाश शेल को निष्पादित करने के लिए पूर्ण पथ (उत्तराधिकारी द्वारा निर्धारित bash द्वारा निर्धारित argv[0] और $PATH का मूल्य; कोने के मामलों में गलत हो सकता है)
$BASH_SUBSHELL बैश सब लेवल
$UID प्रक्रिया चलाने का रियल (प्रभावी नहीं करता है, तो अलग) यूज़र आईडी bash
$PS1 प्राथमिक कमांड लाइन प्रॉम्प्ट; पीएस * चर का उपयोग कर देखें
$PS2 द्वितीयक कमांड लाइन प्रॉम्प्ट (अतिरिक्त इनपुट के लिए प्रयुक्त)
$PS3 तृतीयक कमांड लाइन प्रॉम्प्ट (चुनिंदा लूप में प्रयुक्त)
$PS4 क्वाटरनरी कमांड लाइन प्रॉम्प्ट (वर्बोज़ आउटपुट के साथ जानकारी संलग्न करने के लिए प्रयुक्त)
$RANDOM 0 और 32767 के बीच एक छद्म यादृच्छिक पूर्णांक
$REPLY कोई चर निर्दिष्ट नहीं होने पर डिफ़ॉल्ट रूप से read उपयोग किया जाने वाला चर। उपयोगकर्ता द्वारा आपूर्ति किए गए मूल्य को वापस करने के लिए select द्वारा भी उपयोग किया जाता है
$PIPESTATUS ऐरे वैरिएबल जो हाल ही में निष्पादित अग्रभूमि पाइपलाइन में प्रत्येक कमांड के निकास स्थिति मान रखता है।

परिवर्तनशील असाइनमेंट में पहले और बाद में कोई स्थान नहीं होना चाहिए। a=123 नहीं a = 123 । बाद अलगाव साधन में (एक समान रिक्त स्थान से घिरा हुआ चिह्न) आदेश चला a तर्क के साथ = और 123 है, हालांकि यह भी स्ट्रिंग तुलना ऑपरेटर में देखा जाता है (जो वाक्य रचना करने के लिए एक तर्क है [ या [[ या जो भी आप कर रहे हैं परीक्षण का उपयोग)।

$ BASHPID

बैश के वर्तमान उदाहरण की प्रोसेस आईडी (पीआईडी)। यह $$ चर के समान नहीं है, लेकिन यह अक्सर एक ही परिणाम देता है। यह बैश 4 में नया है और बैश 3 में काम नहीं करता है।

~> $ echo "\$\$ pid = $$  BASHPID = $BASHPID"
$$ pid = 9265  BASHPID = 9265

$ BASH_ENV

बैश स्टार्टअप फ़ाइल की ओर इशारा करते हुए एक पर्यावरण चर, जो एक स्क्रिप्ट के आने पर पढ़ा जाता है।

$ BASH_VERSINFO

एक सरणी जिसमें पूर्ण संस्करण जानकारी तत्वों में विभाजित है, $BASH_VERSION तुलना में बहुत अधिक सुविधाजनक है यदि आप केवल प्रमुख संस्करण की तलाश कर रहे हैं:

~> $ for ((i=0; i<=5; i++)); do echo "BASH_VERSINFO[$i] = ${BASH_VERSINFO[$i]}"; done
BASH_VERSINFO[0] = 3
BASH_VERSINFO[1] = 2
BASH_VERSINFO[2] = 25
BASH_VERSINFO[3] = 1
BASH_VERSINFO[4] = release
BASH_VERSINFO[5] = x86_64-redhat-linux-gnu

$ BASH_VERSION

चलाए जा रहे बैश के संस्करण को दिखाता है, यह आपको यह तय करने की अनुमति देता है कि क्या आप किसी उन्नत सुविधाओं का उपयोग कर सकते हैं:

~> $ echo $BASH_VERSION
4.1.2(1)-release

$ संपादक

डिफ़ॉल्ट संपादक जो किसी भी स्क्रिप्ट या प्रोग्राम, आमतौर पर vi या emacs द्वारा अनपेक्षित होगा।

~> $ echo $EDITOR
vi

$ FUNCNAME

वर्तमान फ़ंक्शन का नाम प्राप्त करने के लिए - टाइप करें:

my_function()
{
    echo "This function is $FUNCNAME"    # This will output "This function is my_function"
}

यदि आप इसे फ़ंक्शन के बाहर टाइप करते हैं तो यह निर्देश कुछ भी नहीं लौटाएगा:

my_function

echo "This function is $FUNCNAME"    # This will output "This function is"

$ HOME

उपयोगकर्ता की होम निर्देशिका

~> $ echo $HOME
/home/user

$ HOSTNAME

स्टार्टअप के दौरान सिस्टम को होस्टनाम सौंपा गया।

~> $ echo $HOSTNAME
mybox.mydomain.com

$ HOSTTYPE

यह चर हार्डवेयर की पहचान करता है, यह निर्धारित करने में उपयोगी हो सकता है कि कौन से बायनेरिज़ को निष्पादित करना है:

~> $ echo $HOSTTYPE
x86_64

$ समूह

उपयोगकर्ता के समूहों की संख्या वाले एक सरणी में है:

#!/usr/bin/env bash
echo You are assigned to the following groups:
for group in ${GROUPS[@]}; do
   IFS=: read -r name dummy number members < <(getent group $group )
   printf "name: %-10s number: %-15s members: %s\n" "$name" "$number" "$members" 
done

$ आईएफएस

आंतरिक फ़ील्ड सेपरेटर स्ट्रिंग समाहित करता है, जो लूपिंग करते समय स्ट्रिंग्स को विभाजित करने के लिए बैश का उपयोग करता है। डिफ़ॉल्ट सफेद वर्ण वर्ण है: \n (newline), \t (टैब) और स्थान। इसे किसी और चीज़ में बदलने से आप विभिन्न वर्णों का उपयोग करके तारों को विभाजित कर सकते हैं:

IFS=","
INPUTSTR="a,b,c,d"
for field in ${INPUTSTR}; do
    echo $field
done 

उपरोक्त का आउटपुट है:

a
b
c
d

टिप्पणियाँ:

$ lineno

वर्तमान स्क्रिप्ट में लाइन नंबर को आउटपुट करता है। स्क्रिप्ट डीबग करते समय अधिकतर उपयोगी।

#!/bin/bash
# this is line 2
echo something  # this is line 3
echo $LINENO # Will output 4

$ MACHTYPE

उपरोक्त $HOSTTYPE समान, इसमें OS के साथ-साथ हार्डवेयर के बारे में भी जानकारी शामिल है

~> $ echo $MACHTYPE
x86_64-redhat-linux-gnu

$ OLDPWD

OLDPWD ( OLDP rint W orking D irectory ) में अंतिम cd कमांड से पहले डायरेक्टरी होती है:

~> $ cd directory
directory> $ echo $OLDPWD
/home/user

$ OSTYPE

मशीन पर चल रहे OS के प्रकार, जैसे, के बारे में जानकारी लौटाता है।

~> $ echo $OSTYPE
linux-gnu

$ पथ

आदेशों के लिए बायनेरिज़ खोजने के लिए खोज पथ। सामान्य उदाहरणों में शामिल हैं /usr/bin और /usr/local/bin

जब कोई उपयोगकर्ता या स्क्रिप्ट कमांड चलाने का प्रयास करता है, तो निष्पादन अनुमति के साथ मेल खाते फ़ाइल को खोजने के लिए $PATH में रास्ते खोजे जाते हैं।

$PATH की निर्देशिकाओं को a : character द्वारा अलग किया जाता है।

~> $ echo "$PATH"
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin

इसलिए, उदाहरण के लिए, उपरोक्त $PATH देखते हुए, यदि आप प्रॉम्प्ट पर lss टाइप lss , तो शेल /usr/kerberos/bin/lss , फिर /usr/local/bin/lss , तब /bin/lss , तब /usr/bin/lss , इस क्रम में, यह निष्कर्ष निकालने से पहले कि ऐसा कोई आदेश नहीं है।

$ PPID

स्क्रिप्ट या शेल के माता-पिता की प्रक्रिया आईडी (पीआईडी), जिसका अर्थ है वर्तमान स्क्रिप्ट या शेल को लागू करने की प्रक्रिया।

~> $ echo $$
13016
~> $ echo $PPID
13015

$ लोक निर्माण विभाग

PWD ( P rint W orking D irectory) वर्तमान में आपके द्वारा वर्तमान में काम कर रहे निर्देशिका:

~> $ echo $PWD
/home/user
~> $ cd directory
directory> $ echo $PWD
/home/user/directory

$ सेकंड

सेकंड की संख्या एक स्क्रिप्ट चल रही है। शेल में दिखाए जाने पर यह काफी बड़ा हो सकता है:

~> $ echo $SECONDS
98834

$ SHELLOPTS

अपने व्यवहार को नियंत्रित करने के लिए स्टार्टअप पर विकल्प बैश की एक आसान सूची की आपूर्ति की जाती है:

~> $ echo $SHELLOPTS
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

$ SHLVL

जब bash कमांड निष्पादित होता है तो एक नया शेल खोला जाता है। $ SHLVL पर्यावरण चर वर्तमान स्तर के शीर्ष पर चल रहे शेल स्तरों की संख्या रखता है।

एक नई टर्मिनल विंडो में, निम्न कमांड निष्पादित करने से उपयोग में लिनक्स वितरण के आधार पर विभिन्न परिणाम प्राप्त होंगे।

echo $SHLVL

फेडोरा 25 का उपयोग करते हुए, आउटपुट "3" है। यह इंगित करता है, कि एक नया शेल खोलते समय, एक प्रारंभिक बैश कमांड एक कार्य को निष्पादित और निष्पादित करता है। प्रारंभिक बैश कमांड एक बाल प्रक्रिया (दूसरा बैश कमांड) निष्पादित करता है, जो बदले में, नए शेल को खोलने के लिए एक अंतिम बैश कमांड निष्पादित करता है। जब नया शेल खुलता है, तो यह 2 अन्य शेल प्रोसेस की चाइल्ड प्रोसेस के रूप में चल रहा होता है, इसलिए "3" का आउटपुट होता है।

निम्नलिखित उदाहरण में (उपयोगकर्ता को फेडोरा 25 चला रहा है), एक नए शेल में $ SHLVL का आउटपुट "3" पर सेट किया जाएगा। जैसा कि प्रत्येक बैश कमांड को निष्पादित किया जाता है, $ SHLVL वेतन वृद्धि एक से।

~> $ echo $SHLVL
3
~> $ bash
~> $ echo $SHLVL
4
~> $ bash
~> $ echo $SHLVL
5

कोई यह देख सकता है कि 'बैश' कमांड को निष्पादित करने (या बैश स्क्रिप्ट को निष्पादित) एक नया खोल खोलता है। इसकी तुलना में, एक स्क्रिप्ट की सोर्सिंग वर्तमान शेल में कोड को चलाती है।

test1.sh

#!/usr/bin/env bash
echo "Hello from test1.sh. My shell level is $SHLVL"
source "test2.sh"

test2.sh

#!/usr/bin/env bash
echo "Hello from test2.sh. My shell level is $SHLVL"

run.sh

#!/usr/bin/env bash
echo "Hello from run.sh. My shell level is $SHLVL"
./test1.sh

निष्पादित:

chmod +x test1.sh && chmod +x run.sh
./run.sh

आउटपुट:

Hello from run.sh. My shell level is 4
Hello from test1.sh. My shell level is 5
Hello from test2.sh. My shell level is 5

$ यूआईडी

एक केवल पढ़ने योग्य चर जो उपयोगकर्ताओं की आईडी संख्या संग्रहीत करता है:

~> $ echo $UID
12345

$ 1 $ 2 $ 3 आदि ...

कमांड लाइन या फ़ंक्शन से स्क्रिप्ट के लिए पास किए गए पोजिशनल पैरामीटर:

#!/bin/bash
# $n is the n'th positional parameter
echo "$1"
echo "$2"
echo "$3"

उपरोक्त का आउटपुट है:

~> $ ./testscript.sh firstarg secondarg thirdarg
firstarg
secondarg
thirdarg

यदि स्थिति संबंधी तर्क की संख्या नौ से अधिक है, तो घुंघराले ब्रेसिज़ का उपयोग किया जाना चाहिए।

#  "set -- " sets positional parameters
set -- 1 2 3 4 5 6 7 8 nine ten eleven twelve
# the following line will output 10 not 1 as the value of $1 the digit 1
# will be concatenated with the following 0
echo $10   # outputs 1
echo ${10} # outputs ten
# to show this clearly:
set -- arg{1..12}
echo $10 
echo ${10}

$ #

कमांड लाइन तर्कों या स्थितीय मापदंडों की संख्या प्राप्त करने के लिए - प्रकार:

#!/bin/bash
echo "$#"

तीन तर्कों के साथ चलने पर ऊपर का उदाहरण आउटपुट के साथ आएगा:

~> $ ./testscript.sh firstarg secondarg thirdarg
3

$ *

एक ही तार में स्थितीय मापदंडों के सभी वापस आ जाएगी।

testscript.sh:

#!/bin/bash
echo "$*"

स्क्रिप्ट को कई तर्कों के साथ चलाएं:

./testscript.sh firstarg secondarg thirdarg 

आउटपुट:

firstarg secondarg thirdarg

$!

बैकग्राउंड में चलने वाली अंतिम नौकरी की प्रक्रिया आईडी (पीआईडी):

~> $ ls &
testfile1 testfile2
[1]+  Done                    ls
~> $ echo $!
21715

$ _

अंतिम कमांड से अंतिम फ़ील्ड को आउटपुट करता है, जो किसी अन्य कमांड को आगे से पास करने के लिए उपयोगी है:

 ~> $ ls *.sh;echo $_
testscript1.sh  testscript2.sh
testscript2.sh

यह स्क्रिप्ट पथ देता है यदि किसी अन्य कमांड से पहले उपयोग किया जाता है:

test.sh:

#!/bin/bash
echo "$_"

आउटपुट:

~> $ ./test.sh # running test.sh
./test.sh

नोट: यह स्क्रिप्ट पथ प्राप्त करने का एक मूर्ख तरीका नहीं है

$?

अंतिम निष्पादित फ़ंक्शन या कमांड की निकास स्थिति। आमतौर पर 0 का मतलब होगा ठीक है और कुछ भी विफलता का संकेत देगा:

~> $ ls *.blah;echo $?
ls: cannot access *.blah: No such file or directory
2
~> $ ls;echo $?
testfile1 testfile2
0

$$

वर्तमान प्रक्रिया की प्रक्रिया आईडी (पीआईडी):

~> $ echo $$
13246

$ @

"$@" अलग-अलग शब्दों के रूप में कमांड लाइन के सभी तर्कों तक फैलता है। यह "$*" से अलग है, जो सभी तर्कों को एक शब्द के रूप में विस्तारित करता है।

"$@" तर्कों के माध्यम से लूपिंग और रिक्त स्थान के साथ तर्कों को संभालने के लिए विशेष रूप से उपयोगी है।

विचार करें कि हम एक स्क्रिप्ट में हैं, जिसे हमने दो तर्कों के साथ लागू किया है, जैसे:

$ ./script.sh "␣1␣2␣" "␣3␣␣4␣"

चर $* या $@ $1␣$2 में विस्तारित होंगे, जो बदले में 1␣2␣3␣4 में विस्तार 1␣2␣3␣4 इसलिए नीचे लूप:

for var in $*; do # same for var in $@; do
    echo \<"$var"\>
done

दोनों के लिए प्रिंट करेंगे

<1>
<2>
<3>
<4>

जबकि "$*" को "$1␣$2" में विस्तारित किया जाएगा जो बदले में "␣1␣2␣␣␣3␣␣4␣" में विस्तारित होगा और इसलिए लूप:

for var in "$*"; do
    echo \<"$var"\>   
done

केवल एक बार echo करेगा और प्रिंट करेगा

<␣1␣2␣␣␣3␣␣4␣>

और अंत में "$@" का विस्तार "$1" "$2" में होगा, जो "␣1␣2␣" "␣3␣␣4␣" और "␣1␣2␣" "␣3␣␣4␣" में विस्तारित होगा

for var in "$@"; do
    echo \<"$var"\>
done

छप जाएगा

<␣1␣2␣>
<␣3␣␣4␣>

इस प्रकार दोनों आंतरिक अंतर को तर्कों और तर्कों को अलग करते हुए संरक्षित किया जाता है। ध्यान दें कि for var in "$@"; do ... निर्माण for var in "$@"; do ... इतना सामान्य और मुहावरेदार है कि यह लूप के लिए डिफ़ॉल्ट है और इसे for var; do ... छोटा किया जा सकता है for var; do ...

$ HISTSIZE

याद किए गए आदेशों की अधिकतम संख्या:

~> $ echo $HISTSIZE
1000

$ यादृच्छिक

हर बार जब इस पैरामीटर को संदर्भित किया जाता है, तो 0 और 32767 के बीच एक यादृच्छिक पूर्णांक उत्पन्न होता है। इस चर के मान को रैंडम संख्या जनरेटर ( स्रोत ) को सौंपना।

~> $ echo $RANDOM 
27119
~> $ echo $RANDOM 
1349


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow