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.
-
bash
padrão de substituição ("${i//.}"
) verifica se há.
em um elemento. (Uma instruçãocase
pode ser mais simples, embora menos semelhante ao código do OP ). -
read
ing$array
inserindo<<< "${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