When using ${parameter:offset:length} expansion, the parser doesn't account for all the ways that a colon can appear in "offset".
For example: $ echo ${PARAM:${OFFSET:-0}} -bash: ${OFFSET: bad substitution or: # declare -A A=([a:b]=0) # echo ${PARAM:${A[a:b]}} -bash: ${A[a: bad substitution It seems that the issue is in the use of skiparith in verify_substring_values. Switching to to skip_to_delim removes this issue. The ${parameter/pattern/string} expansion uses skip_to_delim to search for the second '/' so I suspect it's use is appropriate here as well.