Com um pouco de reescrita adicional. (Ao usar a expressão regular específica do Bash, basta preencher o array BASH_REMATCH
em vez de manipular uma divisão de palavras.)
checkIp()
{
local ip="$1"
if [[ "$ip" =~ ^([0-9]{1,3})\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)$ ]]; then
for ((i=1;i<=4;i++)); do
[[ "${BASH_REMATCH[i]}" == '*' || "${BASH_REMATCH[i]}" -le 255 ]] || return 1
done
return 0
fi
return 1
}
Atualizar de acordo com comentário do proprietário para não permitir números após “*”:
checkIp()
{
local ip="$1"
local asterisk=''
if [[ "$ip" =~ ^([0-9]{1,3})\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)$ ]]; then
for ((i=1;i<=4;i++)); do
[[ "${BASH_REMATCH[i]}" == '*' || ( ! "$asterisk" && "${BASH_REMATCH[i]}" -le 255 ) ]] || return 1
[[ "${BASH_REMATCH[i]}" == '*' ]] && asterisk='1'
done
return 0
fi
return 1
}