https://gist.github.com/magnetikonline/90d6fe30fc247ef110a1
| 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 front of haystack replace with replacement. | ${haystack/#needle/replacement} |
| If needle matches back 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} |