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
I'd like to propose a few additions
${variable##*.}
-> returns everything after the last.
in a string. Handy for getting file extensionsRemove the last character from a string:
Remove the first character from a string: