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} |
-
Star
(220)
You must be signed in to star a gist -
Fork
(40)
You must be signed in to fork a gist
-
-
Save magnetikonline/90d6fe30fc247ef110a1 to your computer and use it in GitHub Desktop.
Can i ask that string concatenation be included?
For example:
VAR1="Hello,"
VAR2=" World"
VAR3="$VAR1$VAR2"
and for literal strings and variable:
VAR1="Hello, "
VAR2="${VAR1}World"
From the guide here:https://linuxize.com/post/bash-concatenate-strings/
Thanks!
BASH Lookup ${!
and $[!NAME*}
can be powerful, too. You can use it to make indirect references or calculate
#!/bin/bash
VAR1="abc"
VAR2="def"
REF="VAR2"
def="1234"
$ echo " \${!VAR*} = '${!VAR*}'"
${!VAR*} = 'VAR1 VAR2'
# Lists all variables that start with VAR
$ echo -e " \${!REF} = '${!REF}'"
${!REF} = 'def'
# Because REF is 'VAR2' and the VALUE of VAR2 is 'def'.
$ echo " \${!VAR1:-NOT FOUND} = '${!VAR1:-NOT FOUND} '"
${!VAR1:-NOT FOUND} = 'NOT FOUND '
# because VAR1 is abc which is not defined. However...
$ CALCREF="VAR${1:-2}"; echo -e " \${CALCREF} = '${CALCREF}':\n \${!CALCREF:-missing} = '${!CALCREF:-missing}'"
${CALCREF} = 'VAR2':
${!CALCREF:-missing} = 'def'
# Use the parameter $1 to lookup VAR${1}. If $1 has no value, use '2' so return the value of VAR2.
# Or if VAR2 not found, return 'missing'
# NOTE that "${!VAR${INDEX}}" will not work - you get `bad substitution`. You have to create the reference variable
# in one statement and the lookup in the next.
$ echo " \${!VAR2:-NOT FOUND} = '${!VAR2:-NOT FOUND}'"
${!VAR2:-NOT FOUND} = '1234'
# because VAR2 = "def" and the value of def is 1234!
Lastly you can do some nesting
$ MYVALUE="${!AREF:-${DEFAULTVAL:-nothing}}"; echo " \${MYVALUE} = '${MYVALUE}'"
${MYVALUE} = 'nothing'
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.
BASH Lookup
${!
and$[!NAME*}
can be powerful, too. You can use it to make indirect references
thanks @nightskyguy - I've actually been needing this for a script recently. Nicely timed. 👍
❓
String manipulation:
I have a variable called
AWS_REGION
, it's value get changed every time I deploy my application to different AWS regions.for example:
AWS_REGION=eu-west-1
// here the value is not fixed.this works, but it's kinda repetitive.
you guys have any suggestions using
sed
,awk
etc...,