A simple example is to emulate the behavior of the coreutils commands dirname and basename. After setting a variable FILE=/tmp/a.txt the output of dirname $FILE and echo ${FILE%/*} is /tmp. We can also create a parameter expansion that emulates basename $FILE that returns a.txt: echo ${FILE##*/}.
As you can see from these two examples parameter expansions are powerful. It’s also obvious that the parameter expansions are quite cryptic. They do not use a syntax that is used elsewhere and are hard to remember. The advantage of parameter expansions is that you can use them directly for ad hoc scripting in the shell.
The remainder of this blog demonstrates all parameter expansions with examples. The Bash manual contains a complete description of parameter expansions.
Examples
Lines starting with $ contain the command line input and lines starting with > contain the output of commands. Each section contains a shell session - all variables have the scope of this section.Get the value of a variable
$ A=value $ echo $A > value $ echo ${A} > value
Assign variable if null
$ echo $F > $ echo ${F:=A} > A $ echo ${F:=B} > A $ echo $F > ASubstitute variable if null
$ echo $F > $ echo ${F:-A} > A $ echo $F > $ G=B $ echo ${G:-A} > BExit shell if variable is null
$ bash -c "echo ${A:?died}" > bash: A: died $ echo $? #return code > 1 $ A=ok $ bash -c "echo ${A:?died}" > ok $ echo $? #return code > 0
Substitute variable if not null
$ echo ${F:+A} > $ F=G $ echo ${F:+A} > A
Substrings from index
$ A=abcdefg $ echo ${A:1} > bcdefg $ echo ${A:1:3} #with optional length parameter > bcd
Length of a string
$ A=abc $ echo ${#A} > 3Delete from left
$ A=abcdefabc $ echo ${A#a} > bcdefabc $ echo ${A#ab} > cdefabc $ echo ${A#b} #no match > abcdefabc $ echo ${A#?b} > cdefabc $ echo ${A#?c} #no match > abcdefabc $ echo ${A#*c} > defabc $ echo ${A#*b} #shorted match > cdefabc $ echo ${A##*b} #longest match > cDelete from right
$ A=abcdefabc $ echo ${A%c} > abcdefab $ echo ${A%b*} #shortest match > abcdefa $ echo ${A%%b*} #longest match > a
Replace variable value
$A=abcdefabc $ echo ${A/a/x} > xbcdefabc $ echo ${A/b/x} > axcdefabc $ echo ${A/#a/x} #from left > xbcdefabc $ echo ${A/#b/x} > abcdefabc $ echo ${A/%c/x} #from right > abcdefabx $ echo ${A/%b/x} > abcdefabc $ echo ${A/b*b/x} > axc $ echo ${A//b/x} #replace all > axcdefaxc $ echo ${A//b} > acdefac
Case conversion
$ A=abc $ echo ${A^} #upper case first > Abc $ echo ${A^^} #upper case all > ABC $ B=DEF $ echo ${B,} #lower case first > dEF $ echo ${B,,} #lower case all > def
Find variable name with prefix
$ echo ${!US*} > USER
Get the value of a parameter defined by the value of another parameter
$ A=B $ B=b_value $ echo ${!A} #Indirect expansion > b_value
You should always keep in mind that the shell parameter expansions can be used with nested parameter expansion, tilde expansions, command substitutions and arithmetic expansions.
Used together with parameter expansions
$ A=abc $ B=a $ echo ${A#$B} > bc $ echo ${A#$B?} > c
Used together with tilde expansion
$ A=./a $ echo ${A/#./~} > /home/user/aUsed together with command substitution
$ A=./a $ cd /usr $ echo ${A/#./$(pwd)} > /usr/a
Used together with arithmetic expansion
$ echo ${A/#./$((1 + 10))} > 11/a
After getting so far in the examples I suggest you have also a look at the other shell expansions supported by Bash.
awesome list of examples that really helps to clarify usage
ReplyDelete