variable="value" echo ${variable} # → value echo $variable # → value Curly braces are used to delimit the variable. echo ${variable}_ # → value_ echo $variable_ # → (empty) set -o nounset echo $variable_ # exits with error "unbound variable" Variable indirection variable="HOME" echo ${!variable} # /usr/alpha Uppercase variable="value" echo ${variable} # → value echo ${variable^} # → Value echo ${variable^^} # → VALUE Lowercase variable="VALUE" echo ${variable} # → VALUE echo ${variable,} # → vALUE echo ${variable,,} # → value Pattern matching variable="VALUE" echo ${variable,,[VAL]} # → valUE echo ${variable,,[LUE]} # → VAlue variable="value" echo ${variable^^[va]} # → VAlue Arrays variables=(one two three) echo ${variables[@]} # → one two three echo ${variables[@]^} # → One Two Three echo ${variables[@]^^} # → ONE TWO THREE echo ${variables[@]^^[oe]} # → OnE twO thrEE echo ${variables[*]^^[oe]} # → OnE twO thrEE echo ${variables[2]^^} # → THREE Substring removal From begginning of string variable="value1 value2" echo ${variable#va} # → lue1 value2 echo ${variable#val} # → ue1 value2 echo ${variable#*l} # → ue1 value2 echo ${variable##val} # → ue1 value2 echo ${variable##*l} # → ue2 From end of string variable="value1 value2" echo ${variable%lue2} # → value1 va echo ${variable%al*} # → value1 v echo ${variable%*l*} # → value1 va String replacement echo ${variable/value/example} # → example1 value2 echo ${variable//#value/example} # → example1 example2 echo ${variable/#value/example} # → example1 value2 echo ${variable/value*/example} # → example echo ${variable/%value2/example} # → value1 example Substring echo ${variable:4} # → e1 value2 echo ${variable:2:3} # → lue # The space before the - sign is required echo ${variable: -3} # → ue2 echo ${variable:1: -1} # → alue1 value echo ${variable: -3: -1} # → ue Length echo ${#variable} # → 13 echo ${#variables[@]} # → 3 echo ${#variables[2]} # → 5