Assignment | |
---|---|
Assign value to variable if variable is not already set, value is returned.Combine with a : no-op to discard/ignore return value . |
${variable="value"} : ${variable="value"} |
Removal | |
Delete shortest match of needle from front of haystack . |
${haystack#needle} |
Delete longest match of needle from front of haystack . |
${haystack##needle} |
Delete shortest match of needle from back of haystack . |
${haystack%needle} |
Delete longest match of needle from back of haystack . |
${haystack%%needle} |
Replacement | |
Replace first match of needle with replacement from haystack . |
${haystack/needle/replacement} |
Replace all matches of needle with replacement from haystack . |
${haystack//needle/replacement} |
If needle matches start of haystack replace with replacement . |
${haystack/#needle/replacement} |
If needle matches end of haystack replace with replacement . |
${haystack/%needle/replacement} |
Substitution | |
If variable not set, return value , else variable . |
${variable-value} |
If variable not set or empty, return value , else variable . |
${variable:-value} |
If variable set, return value , else null string. |
${variable+value} |
If variable set and not empty, return value , else null string. |
${variable:+value} |
Extraction | |
Extract length characters from variable starting at position . |
${variable:position:length} |
Return string length of variable . |
${#variable} |
Escaping | |
Single quotes inside a single quoted string. | echo 'Don'\''t break my escape!' |
Indirection | |
Return value of variable name held in indirect , else value . |
indirect="apple" apple="fruit" ${!indirect-value} |
- https://tldp.org/LDP/abs/html/string-manipulation.html
- https://tldp.org/LDP/abs/html/parameter-substitution.html
- https://tldp.org/LDP/abs/html/ivr.html
- Special characters:
- https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02
- https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion
BASH Lookup
${!
and$[!NAME*}
can be powerful, too. You can use it to make indirect references or calculateLastly you can do some nesting
The above means look up AREF (which does not exist. So instead it looks up DEFAULTVAL which also doesn't exist and thus returns nothing.
If AREF contained a valid reference, or DEFAULTVAL had a value those would have been return.
And here is an important point: by always using
:-
in every variable reference you can safely run a bash script with the '-u' option.-u
is useful for finding uses of unassigned variables. In my experience that often happens due to misspellings which can be a booger to find.