खोज…


परिचय

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

बैश यूजर मैनुअल में और पढ़ें।

वाक्य - विन्यास

  • $ {पैरामीटर: ऑफसेट} # ऑफसेट पर शुरू होने वाला सबस्ट्रिंग
  • $ {पैरामीटर: ऑफसेट: लंबाई} # ऑफसेट पर शुरू होने वाली लंबाई "लंबाई" का पदार्थ
  • $ {# पैरामीटर} # पैरामीटर की लंबाई
  • $ {पैरामीटर / पैटर्न / स्ट्रिंग} # स्ट्रिंग के साथ पैटर्न की पहली घटना को बदलें
  • $ {पैरामीटर // पैटर्न / स्ट्रिंग} # स्ट्रिंग के साथ पैटर्न की सभी घटनाओं को बदलें
  • $ {पैरामीटर / # पैटर्न / स्ट्रिंग} # पैटर्न को स्ट्रिंग से बदलें यदि पैटर्न शुरुआत में है
  • $ {पैरामीटर /% पैटर्न / स्ट्रिंग} # पैटर्न को स्ट्रिंग के साथ बदलें यदि पैटर्न समाप्ति पर है
  • $ {पैरामीटर # पैटर्न} # पैरामीटर की शुरुआत से पैटर्न का सबसे छोटा मिलान निकालें
  • $ {पैरामीटर ## पैटर्न} # पैरामीटर की शुरुआत से पैटर्न का सबसे लंबा मिलान निकालें
  • $ {पैरामीटर% पैटर्न} # पैरामीटर के अंत से पैटर्न का सबसे छोटा मिलान निकालें
  • $ {पैरामीटर %% पैटर्न} # पैरामीटर के अंत से पैटर्न का सबसे लंबा मिलान निकालें
  • $ {पैरामीटर: -word} # अगर पैरामीटर अप्रभावित / अपरिभाषित है तो शब्द का विस्तार करें
  • $ {पैरामीटर: = शब्द} # अगर पैरामीटर अप्रभावित / अपरिभाषित और सेट पैरामीटर है तो शब्द का विस्तार करें
  • $ {पैरामीटर: + शब्द} # शब्द का विस्तार अगर पैरामीटर सेट / परिभाषित

सबस्ट्रिंग और सबरेज़

var='0123456789abcdef'

# Define a zero-based offset
$ printf '%s\n' "${var:3}"
3456789abcdef

# Offset and length of substring
$ printf '%s\n' "${var:3:4}"
3456
4.2
# Negative length counts from the end of the string
$ printf '%s\n' "${var:3:-5}"
3456789a

# Negative offset counts from the end
# Needs a space to avoid confusion with ${var:-6}
$ printf '%s\n' "${var: -6}"
abcdef

# Alternative: parentheses
$ printf '%s\n' "${var:(-6)}"
abcdef

# Negative offset and negative length
$ printf '%s\n' "${var: -6:-5}"
a

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

# Set positional parameter $1
set -- 0123456789abcdef

# Define offset
$ printf '%s\n' "${1:5}"
56789abcdef

# Assign to array element
myarr[0]='0123456789abcdef'

# Define offset and length
$ printf '%s\n' "${myarr[0]:7:3}"
789

समसामयिक विस्तार स्थितिगत मापदंडों पर लागू होते हैं, जहाँ ऑफ़सेट एक-आधारित होते हैं:

# Set positional parameters $1, $2, ...
$ set -- 1 2 3 4 5 6 7 8 9 0 a b c d e f

# Define an offset (beware $0 (not a positional parameter)
# is being considered here as well)
$ printf '%s\n' "${@:10}"
0
a
b 
c
d
e
f

# Define an offset and a length
$ printf '%s\n' "${@:10:3}"
0
a
b

# No negative lengths allowed for positional parameters
$ printf '%s\n' "${@:10:-2}"
bash: -2: substring expression < 0

# Negative offset counts from the end
# Needs a space to avoid confusion with ${@:-10:2}
$ printf '%s\n' "${@: -10:2}"
7
8

# ${@:0} is $0 which is not otherwise a positional parameters or part
# of $@
$ printf '%s\n' "${@:0:2}"
/usr/bin/bash
1

स्थानापन्न विस्तार का उपयोग अनुक्रमित सरणियों के साथ किया जा सकता है:

# Create array (zero-based indices)
$ myarr=(0 1 2 3 4 5 6 7 8 9 a b c d e f)

# Elements with index 5 and higher
$ printf '%s\n' "${myarr[@]:12}"
c
d
e
f

# 3 elements, starting with index 5
$ printf '%s\n' "${myarr[@]:5:3}"
5
6
7

# The last element of the array
$ printf '%s\n' "${myarr[@]: -1}"
f

पैरामीटर की लंबाई

# Length of a string
$ var='12345'
$ echo "${#var}"
5

ध्यान दें कि यह वर्णों की संख्या में लंबाई है जो आवश्यक रूप से बाइट्स की संख्या के समान नहीं है (जैसे UTF-8 में जहां अधिकांश वर्ण एक से अधिक बाइट में एन्कोड किए गए हैं), और न ही ग्लिफ़ / अंगूर की संख्या (जिनमें से कुछ हैं) वर्णों का संयोजन), और न ही यह आवश्यक रूप से प्रदर्शन चौड़ाई के समान है।

# Number of array elements
$ myarr=(1 2 3)
$ echo "${#myarr[@]}"
3

# Works for positional parameters as well
$ set -- 1 2 3 4
$ echo "${#@}"
4

# But more commonly (and portably to other shells), one would use
$ echo "$#"
4

वर्णमाला वर्णों के मामले को संशोधित करना

4.0

अपरकेस करने के लिए

$ v="hello"
# Just the first character
$ printf '%s\n' "${v^}"
Hello
# All characters
$ printf '%s\n' "${v^^}"
HELLO
# Alternative
$ v="hello world"
$ declare -u string="$v"
$ echo "$string"
HELLO WORLD

नीचे करना

$ v="BYE"
# Just the first character
$ printf '%s\n' "${v,}"
bYE
# All characters
$ printf '%s\n' "${v,,}"
bye
# Alternative
$ v="HELLO WORLD"
$ declare -l string="$v"
$ echo "$string"
hello world

केस टॉगल करें

$ v="Hello World"
# All chars
$ echo "${v~~}"
hELLO wORLD
$ echo "${v~}"
# Just the first char
hello World

पैरामीटर अप्रत्यक्ष

Bash अप्रत्यक्ष एक वैरिएबल का मान प्राप्त करने की अनुमति देता है जिसका नाम दूसरे चर में समाहित है। चर उदाहरण:

$ red="the color red"
$ green="the color green"

$ color=red
$ echo "${!color}"
the color red
$ color=green
$ echo "${!color}"
the color green

कुछ और उदाहरण जो अप्रत्यक्ष विस्तार के उपयोग को प्रदर्शित करते हैं:

 $ foo=10
 $ x=foo
 $ echo ${x}      #Classic variable print  
 foo  
 
 $ foo=10
 $ x=foo
 $ echo ${!x}     #Indirect expansion
 10

एक और उदाहरण:

$ argtester () { for (( i=1; i<="$#"; i++ )); do echo "${i}";done; }; argtester -ab -cd -ef 
1   #i expanded to 1 
2   #i expanded to 2
3   #i expanded to 3

$ argtester () { for (( i=1; i<="$#"; i++ )); do echo "${!i}";done; }; argtester -ab -cd -ef 
-ab     # i=1 --> expanded to $1 ---> expanded to first argument sent to function
-cd     # i=2 --> expanded to $2 ---> expanded to second argument sent to function
-ef     # i=3 --> expanded to $3 ---> expanded to third argument sent to function

डिफ़ॉल्ट मान प्रतिस्थापन

${parameter:-word}

यदि पैरामीटर परेशान या अशक्त है, तो शब्द का विस्तार प्रतिस्थापित किया जाता है। अन्यथा, पैरामीटर का मान प्रतिस्थापित किया जाता है।

$ unset var
$ echo "${var:-XX}"     # Parameter is unset -> expansion XX occurs
XX
$ var=""                # Parameter is null -> expansion XX occurs
$ echo "${var:-XX}"
XX
$ var=23                # Parameter is not null -> original expansion occurs
$ echo "${var:-XX}"
23
${parameter:=word}

यदि पैरामीटर परेशान या अशक्त है, तो शब्द का विस्तार पैरामीटर को सौंपा गया है। पैरामीटर का मान तब प्रतिस्थापित किया जाता है। स्थितिगत पैरामीटर और विशेष पैरामीटर को इस तरह से नहीं सौंपा जा सकता है।

$ unset var
$ echo "${var:=XX}"     # Parameter is unset -> word is assigned to XX
XX
$ echo "$var"
XX
$ var=""                # Parameter is null -> word is assigned to XX
$ echo "${var:=XX}"
XX
$ echo "$var"
XX
$ var=23                # Parameter is not null -> no assignment occurs
$ echo "${var:=XX}"
23
$ echo "$var"
23

अगर वेरिएबल खाली है या परेशान है तो त्रुटि

इसके लिए शब्दार्थ डिफ़ॉल्ट मान प्रतिस्थापन के समान हैं, लेकिन डिफ़ॉल्ट मान प्रतिस्थापित करने के बजाय, यह प्रदान किए गए त्रुटि संदेश के साथ त्रुटि करता है। फॉर्म ${VARNAME?ERRMSG} और ${VARNAME:?ERRMSG} । इसके साथ फॉर्म : वेरिएबल के बिनासेट या खाली होने पर हमारे एरर करेगा, जबकि बिना फॉर्म के केवल तभी एरर होगा जब वेरिएबल अनसेट होता है । यदि कोई त्रुटि है, तो ERRMSG आउटपुट है और निकास कोड 1 सेट है।

#!/bin/bash
FOO=
# ./script.sh: line 4: FOO: EMPTY
echo "FOO is ${FOO:?EMPTY}"
# FOO is 
echo "FOO is ${FOO?UNSET}"
# ./script.sh: line 8: BAR: EMPTY
echo "BAR is ${BAR:?EMPTY}"
# ./script.sh: line 10: BAR: UNSET
echo "BAR is ${BAR?UNSET}"

प्रत्येक गलत इको स्टेटमेंट के ऊपर पूर्ण उदाहरण को चलाने के लिए आगे बढ़ने के लिए टिप्पणी की जानी चाहिए।

एक स्ट्रिंग की शुरुआत से एक पैटर्न हटाएं

सबसे छोटा मैच:

$ a='I am a string'
$ echo "${a#*a}"
m a string

सबसे लंबा मैच:

$ echo "${a##*a}"
 string

एक स्ट्रिंग के अंत से एक पैटर्न हटाएं

सबसे छोटा मैच:

$ a='I am a string'
$ echo "${a%a*}"
I am 

सबसे लंबा मैच:

$ echo "${a%%a*}"
I 

स्ट्रिंग में पैटर्न बदलें

पहला मैच:

$ a='I am a string'
$ echo "${a/a/A}"
I Am a string

सभी मैच:

$ echo "${a//a/A}"
I Am A string

शुरुआत में मैच:

$ echo "${a/#I/y}"
y am a string

अंत में मैच करें:

$ echo "${a/%g/N}"
I am a strinN

कुछ नहीं के साथ एक पैटर्न बदलें:

$ echo "${a/g/}"
I am a strin

सरणी आइटम में उपसर्ग जोड़ें:

$ A=(hello world)
$ echo "${A[@]/#/R}"
Rhello Rworld

विस्तार के दौरान मुंग

चर को आवश्यक रूप से अपने मूल्यों तक विस्तारित करने की आवश्यकता नहीं है - विस्तार के दौरान सबस्ट्रिंग निकाले जा सकते हैं, जो फ़ाइल एक्सटेंशन या पथ के कुछ हिस्सों को निकालने के लिए उपयोगी हो सकते हैं। ग्लोबिंग वर्ण अपने सामान्य अर्थ रखते हैं, इसलिए .* एक शाब्दिक बिंदु को संदर्भित करता है, इसके बाद वर्णों का कोई भी क्रम; यह एक नियमित अभिव्यक्ति नहीं है।

$ v=foo-bar-baz
$ echo ${v%%-*}
foo
$ echo ${v%-*}
foo-bar
$ echo ${v##*-}
baz
$ echo ${v#*-}
bar-baz

डिफ़ॉल्ट मान का उपयोग करके एक चर का विस्तार करना भी संभव है - कहते हैं कि मैं उपयोगकर्ता के संपादक को आमंत्रित करना चाहता हूं, लेकिन अगर उन्होंने एक सेट नहीं किया है तो मैं उन्हें vim देना चाहूंगा।

$ EDITOR=nano
$ ${EDITOR:-vim} /tmp/some_file
# opens nano
$ unset EDITOR
$ $ ${EDITOR:-vim} /tmp/some_file
# opens vim

इस विस्तार को करने के दो अलग-अलग तरीके हैं, जो इस बात से भिन्न हैं कि क्या संबंधित चर खाली है या परेशान है। उपयोग करना :- चर का उपयोग न होने पर या खाली होने पर, डिफ़ॉल्ट का उपयोग करेगा, जबकि - केवल चर का उपयोग न होने पर डिफ़ॉल्ट का उपयोग करता है, लेकिन यदि यह रिक्त स्ट्रिंग पर सेट है, तो चर का उपयोग करेगा:

$ a="set"
$ b=""
$ unset c
$ echo ${a:-default_a} ${b:-default_b} ${c:-default_c}
set default_b default_c
$ echo ${a-default_a} ${b-default_b} ${c-default_c}
set default_c

चूक के समान, विकल्प दिए जा सकते हैं; यदि एक विशेष चर उपलब्ध नहीं है, तो डिफ़ॉल्ट का उपयोग किया जाता है, यदि चर उपलब्ध है तो एक विकल्प का उपयोग किया जाता है।

$ a="set"
$ b=""
$ echo ${a:+alternative_a} ${b:+alternative_b}
alternative_a

यह देखते हुए कि इन विस्तार को घोंसला बनाया जा सकता है, विकल्प का उपयोग विशेष रूप से उपयोगी हो जाता है जब कमांड लाइन के झंडे को तर्क की आपूर्ति करते हैं;

$ output_file=/tmp/foo
$ wget ${output_file:+"-o ${output_file}"} www.stackexchange.com
# expands to wget -o /tmp/foo www.stackexchange.com
$ unset output_file
$ wget ${output_file:+"-o ${output_file}"} www.stackexchange.com
# expands to wget  www.stackexchange.com 

पैरामीटर विस्तार और फ़ाइल नाम

आप basename और dirname जैसे सामान्य फ़ाइलनाम-प्रसंस्करण कार्यों का अनुकरण करने के लिए बैश पैरामीटर विस्तार का उपयोग कर सकते हैं।

हम इसका उपयोग हमारे उदाहरण पथ के रूप में करेंगे:

FILENAME="/tmp/example/myfile.txt"

dirname का अनुकरण करने के लिए और एक फ़ाइल पथ के निर्देशिका नाम को वापस करने के लिए:

echo "${FILENAME%/*}"
#Out: /tmp/example

basename $FILENAME का अनुकरण करने और फ़ाइल पथ का फ़ाइल नाम वापस करने के लिए:

echo "${FILENAME##*/}"
#Out: myfile.txt

basename $FILENAME .txt का अनुकरण करने के लिए .txt. बिना फ़ाइल नाम वापस करें .txt. विस्तार:

BASENAME="${FILENAME##*/}"
echo "${BASENAME%%.txt}"
#Out: myfile


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