This is a case modification substitution. Here is the description (from the Bash manual on shell parameter expansion):
${parameter^pattern}
${parameter^^pattern}
${parameter,pattern}
${parameter,,pattern}
This expansion modifies the case of alphabetic characters in
parameter. The pattern is expanded to produce a pattern just as in
filename expansion. Each character in the expanded value of parameter
is tested against pattern, and, if it matches the pattern, its case is
converted. The pattern should not attempt to match more than one
character. The ‘^
’ operator converts lowercase letters matching
pattern to uppercase; the ‘,
’ operator converts matching uppercase
letters to lowercase. The ‘^^
’ and ‘,,
’ expansions convert each
matched character in the expanded value; the ‘^
’ and ‘,
’ expansions
match and convert only the first character in the expanded value. If
pattern is omitted, it is treated like a ‘?
’, which matches every
character. If parameter is ‘@
’ or ‘*
’, the case modification operation
is applied to each positional parameter in turn, and the expansion is
the resultant list. If parameter is an array variable subscripted with
‘@
’ or ‘*
’, the case modification operation is applied to each member
of the array in turn, and the expansion is the resultant list.
This works on bash >= 4.0.
Alternatively, you can use
response=$(echo "$response" | tr '[:upper:]' '[:lower:]')