Seu getsubstr $var0
está passando 5 args para a função.
Além disso, $ * e $ @ testam cada argumento individual de $ 1 $ 2 etc .. contra a # patttern.
Em relação ao RegEx em bash
: eu adicionei alguns exemplos no final, e btw, '*' é apenas um especial regex char quando é usado em um contexto regex, ie. ao usar = ~ .
Em seu primeiro uso de * em ${*
, o uso especial do asterisco é como o nome (psuedo) de uma var que se expande para uma concatenação de todas as vars: $ 1 $ 2 $ ... etc. ..
Seu segundo uso de um asterisco, em #*"${2}"
, significa "$ 2" precedido por qualquer coisa, incluindo nada , será correspondido com cada $ 1 etc arg separado / individualmente.
O script a seguir pode ajudar com $ @ e $ * (por exemplo) ...
#!/bin/bash
#
getsubstr() {
echo -n " ${#@} args";
[[ "$1$2$3$4$5$6" == *\ * ]] && echo " (with embedded spaces)" || echo " (no spaces)"
echo ' "${*}" '\|"${*}"\|
echo ' ${*} '\|${*}\|
echo ' "${@}" '\|"${@}"\|
echo ' ${@} '\|${@}\|
echo ' "${*#*"${2}}" '\|"${*#*"${2}"}"\|
echo ' ${*#*"${2}} '\|${*#*"${2}"}\|
echo ' "${@#*"${2}}" '\|"${@#*"${2}"}"\|
echo ' ${@#*"${2}} '\|${@#*"${2}"}\|
echo ' ${*#B} '\|${*#B}\|
echo ' "${*#B}" '\|"${*#B}"\|
echo ' ${@#B} '\|${@#B}\|
echo ' "${@#B}" '\|"${@#B}"\|
}
var0="a B c "
echo
echo -n "Passing "; getsubstr "$var0" ; echo
echo -n "Passing "; getsubstr $var0 ; echo
echo -n "Passing "; getsubstr "$var0" "$var0" ; echo
echo -n "Passing "; getsubstr $var0 $var0 ; echo
echo
exit
###################################################################
RegEx em bash
# Regex checks: "=~" uses extended regular expression
#+ Parenthesized subexpressions within the regular expression are saved
#+ in the array variable BASH_REMATCH
#+ $BASH_REMATCH / ${BASH_REMATCH[0]} is the string matching the entire regular expression.
#+ ${BASH_REMATCH[n]} is the sub string matching the nth parenthesized subexpression
[[ "abcdef" =~ (.)(.)(.) ]] && echo "# $BASH_REMATCH"
# abc
[[ "abcdef" =~ (.)(.)(.) ]] && echo "# ${BASH_REMATCH[0]}"
# abc
[[ "abcdef" =~ (.)(.)(.) ]] && echo "# ${BASH_REMATCH[2]}"
# b
[[ "abcdef" =~ (.)(.)(.) ]] && echo "# ${BASH_REMATCH[@]}"
# abc a b c