Corrigir, (veja também resposta de S. Chazelas para o fundo), com resultados sensatos:
#!/bin/bash
IN="One-XX-X-17.0.0"
IFS='-' read -r -a ADDR <<< "$IN"
for i in "${ADDR[@]}"; do
if [ "$i" = "${i//.}" ] ; then
echo "Element:$i"
continue
fi
# split 17.0.0 into NUM
IFS='.' read -a array <<< "$i"
for element in "${array[@]}" ; do
echo "Num:$element"
done
done
Saída:
Element:One
Element:XX
Element:X
Num:17
Num:0
Num:0
Notas:
-
É melhor colocar o laço segundo condicional no primeiro loop.
-
bashpadrão de substituição ("${i//.}") verifica se há.em um elemento. (Uma instruçãocasepode ser mais simples, embora menos semelhante ao código do OP ). -
reading$arrayinserindo<<< "${ADDR[3]}"é menos geral que<<< "$i". Evita a necessidade de saber qual elemento tem o.s. -
O código pressupõe que a impressão " Elemento: 17.0.0 " não é intencional. Se esse comportamento for pretendido, substitua o loop principal por:
for i in "${ADDR[@]}"; do echo "Element:$i" if [ "$i" != "${i//.}" ] ; then # split 17.0.0 into NUM IFS='.' read -a array <<< "$i" for element in "${array[@]}" ; do echo "Num:$element" done fi done