हमारी चल रही bash ट्यूटोरियल सीरीज़ के भाग के रूप में, हमने पिछले लेख में bash स्थितिगत पैरामीटर्स पर चर्चा की। इस लेख में आइए कुछ व्यावहारिक शेल स्क्रिप्ट उदाहरणों के साथ bash विशेष पैरामीटर्स पर चर्चा करें।
कुछ bash विशेष पैरामीटर्स जिन पर हम इस लेख में चर्चा करेंगे: $*, $@, $#, $$, $!, $?, $-, $_
पूरी स्थितिगत पैरामीटर्स की सूची तक पहुंचने के लिए, दो विशेष पैरामीटर्स $* और $@ उपलब्ध हैं। डबल कोट्स के बाहर, ये दोनों समतुल्य हैं: दोनों $1 से शुरू होने वाले स्थितिगत पैरामीटर्स की सूची में विस्तारित होते हैं (स्पेस द्वारा अलग)।
डबल कोट्स के भीतर, हालांकि, वे भिन्न होते हैं: डबल कोट्स की एक जोड़ी के भीतर $* स्थितिगत पैरामीटर्स की सूची के बराबर है, जो IFS के पहले वर्ण द्वारा अलग किए गए हैं "$1c$2c$3..."।
डबल कोट्स की एक जोड़ी के भीतर $@ स्थितिगत पैरामीटर्स की सूची के बराबर है, जो अनकोटेड स्पेस द्वारा अलग किए गए हैं, यानी, "$1" "$2"..."$N"।
उदाहरण 1: स्थितिगत पैरामीटर्स का विस्तार करने के लिए Bash $* और $@ का उपयोग करें
यह उदाहरण $* और $@ में उपलब्ध मान दिखाता है।
पहले, नीचे दिखाए अनुसार expan.sh बनाएं।
$ cat expan.sh #!/bin/bash export IFS='-' cnt=1 # $* में उपलब्ध डेटा प्रिंट करें echo "Values of \"\$*\":" for arg in "$*" do echo "Arg #$cnt= $arg" let "cnt+=1" done cnt=1 # $@ में उपलब्ध डेटा प्रिंट करें echo "Values of \"\$@\":" for arg in "$@" do echo "Arg #$cnt= $arg" let "cnt+=1" done
अगला, $* और $@ कैसे काम करते हैं यह देखने के लिए नीचे दिखाए अनुसार expan.sh निष्पादित करें।
$ ./expan.sh "This is" 2 3 Values of "$*": Arg #1= This is-2-3 Values of "$@": Arg #1= This is Arg #2= 2 Arg #3= 3
- उपरोक्त स्क्रिप्ट ने IFS (आंतरिक फील्ड सेपरेटर) का मान '-' के साथ निर्यात किया।
- स्क्रिप्ट expan.sh को तीन पैरामीटर पास किए गए हैं $1="This is",$2="2" और $3="3"।
- विशेष पैरामीटर "$*" के प्रत्येक मान को प्रिंट करते समय, यह केवल एक मान देता है जो IFS द्वारा सीमित पूरे स्थितिगत पैरामीटर हैं।
- जबकि "$@" आपको प्रत्येक पैरामीटर को अलग शब्द के रूप में देता है।
उदाहरण 2: स्थितिगत पैरामीटर्स गिनने के लिए $# का उपयोग करें
$# bash में विशेष पैरामीटर है जो आपको दशमलव में स्थितिगत पैरामीटर्स की संख्या देता है।
पहले, नीचे दिखाए अनुसार arithmetic.sh बनाएं।
$ cat arithmetic.sh #!/bin/bash if [ $# -lt 2 ] then echo "Usage: $0 arg1 arg2" exit fi echo -e "\$1=$1" echo -e "\$2=$2" let add=$1+$2 let sub=$1-$2 let mul=$1*$2 let div=$1/$2 echo -e "Addition=$add\nSubtraction=$sub\nMultiplication=$mul\nDivision=$div\n"
यदि स्थितिगत पैरामीटर्स की संख्या 2 से कम है, तो यह नीचे दिखाए अनुसार उपयोग जानकारी फेंक देगा,
$ ./arithemetic.sh 10 Usage: ./arithemetic.sh arg1 arg2
उदाहरण 3: प्रक्रिया संबंधी पैरामीटर्स - $$ और $!
विशेष पैरामीटर $$ शेल की प्रक्रिया आईडी देगा। $! आपको सबसे हाल ही में निष्पादित बैकग्राउंड प्रक्रिया की प्रक्रिया आईडी देता है।
निम्नलिखित स्क्रिप्ट शेल की प्रक्रिया आईडी और अंतिम निष्पादित बैकग्राउंड प्रक्रिया आईडी प्रिंट करती है।
$ cat proc.sh #!/bin/bash echo -e "Process ID=$$" sleep 1000 & echo -e "Background Process ID=$!"
अब, उपरोक्त स्क्रिप्ट निष्पादित करें, और प्रक्रिया आईडी जांचें जो यह प्रिंट कर रहा है।
$ ./proc.sh Process ID=9502 Background Process ID=9503 $ ps PID TTY TIME CMD 5970 pts/1 00:00:00 bash 9503 pts/1 00:00:00 sleep 9504 pts/1 00:00:00 ps $
उदाहरण 4: अन्य Bash विशेष पैरामीटर्स - $?, $-, $_
- $? सबसे हाल ही में निष्पादित कमांड की एग्जिट स्टेटस देता है।
- $- set बिल्ट-इन कमांड का उपयोग करके सेट विकल्प
- $_ पिछली कमांड का अंतिम आर्ग्यूमेंट देता है। शेल स्टार्टअप पर, यह निष्पादित किए जा रहे शेल स्क्रिप्ट का पूर्ण फ़ाइलनाम देता है।
$ cat others.sh #!/bin/bash echo -e "$_"; ## निष्पादित की जा रही फ़ाइल का पूर्ण नाम /usr/local/bin/dbhome # कमांड निष्पादित करें। # dbhome की एग्जिट स्टेटस जांचें if [ "$?" -ne "0" ]; then echo "Sorry, Command execution failed !" fi echo -e "$-"; # सेट विकल्प - hB echo -e $_ # पिछली कमांड का अंतिम आर्ग्यूमेंट।
उपरोक्त स्क्रिप्ट में, अंतिम echo स्टेटमेंट "echo -e $_" ($ अंडरस्कोर) भी hB प्रिंट करता है जो पिछली कमांड के अंतिम आर्ग्यूमेंट का मान है। इसलिए $_ विस्तार के बाद मान देगा
$ ./others.sh ./others.sh /home/oracle Sorry, Command execution failed ! hB hB